如何在Pandas DataFrame中按多列分组计算滚动均值并保留原索引?
如何在Pandas DataFrame中按多列分组计算滚动均值并保留原索引?
我明白你的问题啦!你想要按type和type2分组计算滚动均值,同时保留原DataFrame的索引,还要在窗口数据不足时也能计算均值(而不是直接显示NaN)。咱们来一步步解决这个问题:
你的现有代码存在两个核心问题:
- 滚动窗口的
min_periods参数缺失:默认情况下rolling(window=3)的min_periods=3,这意味着只有当窗口内至少有3个数据时才会计算均值,不足的就返回NaN,但你期望的是哪怕只有1个数据也要计算均值。 - 索引对齐错误:你用
reset_index(drop=True)会把所有索引(包括原DataFrame的行索引)都去掉,导致分组后的滚动结果顺序被打乱,和原数据行对应不上;而尝试reset_index(level=0, drop=True)时,因为分组是两个列,索引层级不匹配,所以会抛出incompatible index的错误。
修正后的解决方案代码
import pandas as pd data = {'values': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15], 'type':['A','B','A','B','A','B','A','B','A','B','A','B','A','B','A'], 'type2':['C','D','C','D','C','D','C','D','C','D','C','D','C','D','C']} df = pd.DataFrame(data) window_size = 3 # 关键修改:添加min_periods=1,仅移除分组索引层级,保留原行索引以实现对齐 df['mean'] = df.groupby(['type','type2'])['values'].rolling(window=window_size, min_periods=1).mean().reset_index(level=[0,1], drop=True) print(df)
运行结果(和你期望的一致)
values type type2 mean 0 1 A C 1.0 1 2 B D 2.0 2 3 A C 2.0 3 4 B D 3.0 4 5 A C 3.0 5 6 B D 4.0 6 7 A C 5.0 7 8 B D 6.0 8 9 A C 7.0 9 10 B D 8.0 10 11 A C 9.0 11 12 B D 10.0 12 13 A C 11.0 13 14 B D 12.0 14 15 A C 13.0
代码说明
min_periods=1:这个参数让Pandas在窗口数据不足时,用现有的所有数据计算均值(比如第一个数据直接返回自身,第二个数据返回前两个的平均值,第三个及以后返回窗口内3个数据的平均值)。reset_index(level=[0,1], drop=True):这里的level=[0,1]对应分组的两个列(type和type2)的索引层级,移除这两个层级后,剩下的就是原DataFrame的行索引,这样赋值给df['mean']时,Pandas会自动按索引对齐,完全不会打乱原数据的顺序。
备注:内容来源于stack exchange,提问作者Don Woodward
相关产品推荐
相关产品推荐

