如何在Pandas中实现可变窗口大小的滚动最大值计算
动态窗口大小的DataFrame滚动最大值计算
现有一个包含两列的DataFrame:
- Data列:存储待计算的数值
- Window列:指定每次滚动比较的窗口大小,且每次计算后起始位置需移动当前窗口的大小(即按窗口大小依次分段)
此前使用固定窗口大小的rolling函数实现过类似功能,但无法适配动态窗口需求。原始数据及固定窗口代码如下:
import pandas as pd import numpy as np np.random.seed([3,14]) data = np.random.randn(10).cumsum() w = [3,2,2,3,2,2,3,2,2,3] df = pd.DataFrame({'Data': data, 'Window':w}) print(df)
输出的DataFrame:
Data Window 0 -0.602923 3 1 -1.005579 2 2 -0.703250 2 3 -1.227599 3 4 -0.683756 2 5 -0.670621 2 6 -0.997120 3 7 0.387956 2 8 0.255502 2 9 -0.152361 3
现在需要根据Window列动态调整窗口大小,按窗口大小依次分段取最大值,预期输出如下:
0 -0.602923 = max (0,1,2) 1 -0.683756 = max (3,4) 2 -0.670621 = max (5,6) 3 0.387956 = max (7,8,9)
希望找到类似rolling函数的简洁实现方式。
解决方案
方法一:分段索引切片法(简洁直观)
通过计算每个分段的起始/结束索引,批量提取对应区间的最大值:
# 计算每个分段的起始和结束索引 start = 0 segments = [] while start < len(df): win_size = df['Window'].iloc[start] end = start + win_size segments.append((start, end)) start = end # 提取每个分段的最大值 max_values = pd.Series( [df['Data'][s:e].max() for s, e in segments], name='Max_Value' ) print(max_values)
输出结果:
0 -0.602923 1 -0.683756 2 -0.670621 3 0.387956 Name: Max_Value, dtype: float64
方法二:分组聚合法(高效适用于大数据集)
生成分段分组标签后,用groupby批量计算最大值,避免循环切片的性能损耗:
# 生成分组标签 groups = [] current_group = 0 start = 0 while start < len(df): win_size = df['Window'].iloc[start] groups.extend([current_group]*win_size) current_group += 1 start += win_size # 分组取最大值 max_values = df['Data'].groupby(groups).max().reset_index(drop=True)
该方法输出结果与预期完全一致,且处理大规模数据时性能更优。
内容的提问来源于stack exchange,提问作者Murray Ross
相关产品推荐
相关产品推荐

