如何在Pandas DataFrame中高效计算当前行3行范围内的列最大值?
高效计算Pandas DataFrame滑动窗口最大值(前后3行范围)
问题背景
现有如下Pandas DataFrame:
import pandas as pd data = pd.DataFrame(data={'input':[1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,14.5, 13.5,12.5,11.5,10.5, 9.5,8.5,7.5,6.5,5.5, 4.5,3.5,2.5,1.5,0.5]})
需要在input列右侧新增一列max,存储当前行前后3行范围内input列的最大值,预期结果如下:
data['max'] = [4,5,6,7,8,9,10,11,12,13, 14,15,15,15,15,15,15,15,14.5,13.5,12.5, 11.5,10.5,9.5,8.5,7.5,6.5,5.5,4.5,3.5]
由于数据量达百万级,逐行迭代的方式效率过低,需要采用基于向量化的高效数组操作方法。
解决方案
使用Pandas内置的rolling方法实现中心滑动窗口计算,完全基于向量化操作,性能远优于逐行循环:
import pandas as pd data = pd.DataFrame(data={'input':[1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,14.5, 13.5,12.5,11.5,10.5, 9.5,8.5,7.5,6.5,5.5, 4.5,3.5,2.5,1.5,0.5]}) # 计算前后3行范围内的最大值 data['max'] = data['input'].rolling(window=7, center=True, min_periods=1).max() # 验证结果(可选) print(data['max'].tolist())
参数说明
window=7:窗口覆盖当前行及前后各3行,总计7行数据center=True:将当前行设为窗口的中心位置,确保窗口包含前后3行min_periods=1:允许窗口中至少存在1个数据点,自动处理首尾无法凑齐7行的边界情况
扩展说明
后续需要计算min列时,只需将.max()替换为.min()即可,同样基于向量化操作,效率一致:
data['min'] = data['input'].rolling(window=7, center=True, min_periods=1).min()
内容的提问来源于stack exchange,提问作者PTTHomps
相关产品推荐
相关产品推荐

