高效优雅地获取Pandas Series子区间最大值的方法
高效生成向后滚动子区间最大值序列(Pandas)
给定如下Pandas Series:
index | value ------------- 0 | 2 1 | 0 2 | 8 3 | 0 4 | 1 5 | 2 6 | 7 7 | 4 8 | 2 9 | 9 10 | 0 11 | 0
需要生成向后滚动子区间最大值序列:对每个索引i,取从i开始的最多5个元素的最大值(不足5个时取剩余所有元素的最大值),期望结果如下:
index | value ------------- 0 | 8 1 | 8 2 | 8 3 | 7 4 | 7 5 | 9 6 | 9 7 | 9 8 | 9 9 | 9 10 | 0 11 | 0
高效实现方案
完全不需要用迭代(iloc/iterrows这类方法效率极低),可以利用Pandas的向量化滚动窗口API,通过「反转序列+向前滚动+再反转」的方式实现,全程是批量操作,性能拉满:
import pandas as pd # 原始Series s = pd.Series([2, 0, 8, 0, 1, 2, 7, 4, 2, 9, 0, 0]) window_size = 5 # 核心实现:反转后转向前滚动计算,再反转回原顺序 result = s[::-1].rolling(window=window_size, min_periods=1).max()[::-1] # 输出验证 print(result)
逻辑说明
s[::-1]:将原始序列反转,把「向后取窗口」的需求转化为Pandas原生支持的「向前取窗口」需求rolling(window=window_size, min_periods=1).max():对反转后的序列做向前滚动最大值计算,min_periods=1参数保证当剩余元素不足窗口大小时,仍能取现有元素的最大值- 最后用
[::-1]反转回原顺序,直接得到目标结果
内容的提问来源于stack exchange,提问作者oos1111
相关产品推荐
相关产品推荐

