Pandas rolling窗口步长等于窗口大小时求和结果异常求助
问题原因与解决方案
首先明确你的目标:对pd.Series(range(16))按连续4个元素分组求和,得到[6,22,38,54]。
为什么rolling参数调整后会出问题?
当你使用rolling(window=4, step=4)时,closed参数的作用是控制窗口的闭合区间:
closed='right'(默认):窗口包含右端点,每个窗口对应索引[0-3], [4-7], [8-11], [12-15],求和结果为6,22,38,54,结果索引为3,7,11,15closed='left':窗口包含左端点,窗口对应索引同样是上述分组,结果索引为0,4,8,12,求和值也正确- 若设置
closed='neither',窗口不包含两端,会导致每个窗口只取中间2个元素,结果完全不符合预期 - 如果你使用的是Pandas 1.3.0之前的版本,
step参数在rolling中的行为存在bug,可能会丢失最后一个窗口的结果
正确的rolling用法
确保你的Pandas版本≥1.3.0,直接使用以下代码即可得到预期结果:
import pandas as pd s = pd.Series(range(16)) result = s.rolling(window=4, step=4).sum() # 转换为整数列表: result_list = [int(x) for x in result.tolist()] # [6, 22, 38, 54]
更简洁的替代方案:groupby
对于这种非重叠固定窗口分组的需求,用groupby比rolling更直观,代码也更简洁:
import pandas as pd s = pd.Series(range(16)) result = s.groupby(s.index // 4).sum() result_list = result.tolist() # [6,22,38,54]
这里s.index //4会把索引0-3归为组0,4-7归为组1,以此类推,直接分组求和即可得到你要的结果。
内容的提问来源于stack exchange,提问作者Marti
相关产品推荐
相关产品推荐

