如何确保pandas rolling窗口函数返回固定大小的窗口
pandas固定大小滚动窗口迭代问题解决
问题本质
pandas.DataFrame.rolling返回的Rolling可迭代对象,迭代时会从数据第一行开始逐行返回对应窗口,即使设置了min_periods=窗口大小,前窗口大小-1个元素不足的窗口依然会被返回,这是迭代逻辑的固有行为,不是参数设置错误。
同时Rolling对象不支持切片操作,直接写df.rolling(2)[1:]时,方括号内的切片会被识别为列名索引参数,切片类型不可哈希,因此触发TypeError: unhashable type: 'slice'报错。
可行解决方案
方案1:迭代时手动过滤长度不足的窗口
逐窗口执行自定义操作时,直接在循环内判断窗口长度,跳过不满足固定大小要求的窗口即可:
import pandas as pd import numpy as np df = pd.DataFrame({'B': [0, 1, 2, np.nan, 4]}) window_len = 2 for pairs in df.rolling(window_len, min_periods=window_len): # 跳过元素数量不足固定窗口大小的初始窗口 if len(pairs) < window_len: continue print(pairs)
运行后输出的窗口全部为2个元素,符合固定窗口要求:
B 0 0.0 1 1.0 B 1 1.0 2 2.0 B 2 2.0 3 NaN B 3 NaN 4 4.0
方案2:聚合计算场景直接使用内置rolling方法
如果不需要逐窗口写自定义逻辑,只是做聚合类计算(求和、均值、自定义agg函数等),不需要额外过滤,设置min_periods=2后,长度不足2的第一个窗口会自动返回空值,不会用单元素参与计算:
# 滚动求和示例 print(df.rolling(2, min_periods=2).sum())
输出结果:
B 0 NaN 1 1.0 2 3.0 3 NaN 4 NaN
注意:不要尝试对Rolling对象直接做切片操作,该类未实现
__getitem__的切片逻辑,所有筛选都建议在循环内完成,或者先对原始DataFrame做偏移处理后再调用rolling。
内容的提问来源于stack exchange,提问作者Venkatachalam
相关产品推荐
相关产品推荐

