如何让Pandas Rolling遍历整个Series?窗口与步长相等时的问题
问题解答:Pandas rolling 步长等于窗口大小时未处理最后一组元素
首先,你遇到的这个情况确实是Pandas rolling函数在特定参数组合下的行为——当step等于window时,部分版本的Pandas中默认的窗口生成逻辑可能会忽略最后一组刚好对齐到序列末尾的元素。不过我们有更可靠的方法来实现你想要的[1., 2., 3.]结果。
为什么你的代码没捕获到最后一组?
从你的测试输出和打印的中间结果来看,rolling函数没有生成最后一个窗口[6,7,8],这是因为旧版Pandas的窗口生成逻辑中,可能对“起始位置+窗口长度等于序列长度”的边界情况处理不够完善,导致最后一组被跳过。不过不管版本差异,我们有更直接的替代方案。
实现目标结果的两种方法
方法1:使用groupby(推荐,跨版本稳定)
因为你的需求是将序列按每3个元素为一组求均值,步长和窗口大小完全一致,用groupby实现逻辑更清晰,结果也更可靠:
import pandas as pd s = pd.Series([1., 1., 1., 2., 2., 2., 3., 3., 3.]) # 按索引整除3分组,每组求均值 result = s.groupby(s.index // 3).mean() # 重置索引得到连续的Series result = result.reset_index(drop=True) print(result) # 输出: # 0 1.0 # 1 2.0 # 2 3.0 # dtype: float64
方法2:调整rolling参数(适配新版Pandas)
如果你坚持要用rolling函数,在Pandas 1.3.0及以上版本中,设置closed='right'后可以正常生成最后一组窗口,再过滤掉NaN即可:
import pandas as pd s = pd.Series([1., 1., 1., 2., 2., 2., 3., 3., 3.]) rolling_result = s.rolling(window=3, step=3, closed='right').mean() # 过滤无效的NaN值,重置索引得到目标结果 result = rolling_result.dropna().reset_index(drop=True) print(result) # 输出: # 0 1.0 # 1 2.0 # 2 3.0 # dtype: float64
验证你的测试数据
针对你给出的测试DataFrame,用groupby可以更直观地看到每组的均值覆盖情况:
import pandas as pd df = pd.DataFrame({"A": [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]}) # 给每行标记所属组的均值 df["group_mean"] = df["A"].groupby(df.index // 3).transform('mean') print(df) # 输出: # A group_mean # 0 0.0 1.0 # 1 1.0 1.0 # 2 2.0 1.0 # 3 3.0 4.0 # 4 4.0 4.0 # 5 5.0 4.0 # 6 6.0 7.0 # 7 7.0 7.0 # 8 8.0 7.0
内容的提问来源于stack exchange,提问作者semyd
相关产品推荐
相关产品推荐

