分组计算滚动均值遇索引错误及结果不符问题求助
解决Pandas分组滚动均值的索引错误与结果不符问题
在使用pd.Series.rolling.mean()进行分组滚动均值计算时,会遇到索引不兼容错误,且强制转换后结果不符合预期,以下是问题重现与解决方案:
问题重现
测试代码与数据
import pandas as pd import numpy as np df = pd.DataFrame({ 'a': np.random.choice(['x', 'y'], 8), 'b': np.random.choice(['r', 's'], 8), 'c': np.arange(1, 8 + 1) })
示例数据:
a b c 0 y s 1 1 y r 2 2 y s 3 3 y r 4 4 y s 5 5 x r 6 6 y r 7 7 x r 8
执行代码与错误
尝试直接计算分组滚动均值并赋值:
df['ROLLING_MEAN'] = df.groupby(['a', 'b'])['c'].rolling(3).mean()#.values
触发错误:
TypeError: incompatible index of inserted column with frame index
取消.values注释后代码可运行,但结果不符合预期:比如筛选a='x'且b='r'的分组时,出现错位的滚动均值,预期输出应为:
a b c ROLLING_MEAN 0 x r 1 NaN 2 x r 3 NaN 3 x r 4 ((1 + 3 + 4) / 3) 4 x r 5 ((3 + 4 + 5) / 3) 7 x r 8 ((4 + 5 + 8) / 3)
问题原因
- 索引不兼容:
groupby.rolling()返回多层索引结果(外层为分组键,内层为原DataFrame索引),直接赋值时与原DataFrame的单层索引不匹配,导致报错。 - 结果错位:使用
.values强制赋值会将分组计算结果按顺序平铺,忽略原索引,导致值与对应行错位。
解决方案
使用groupby.transform()方法,它会自动将分组内的计算结果对齐到原DataFrame的索引:
df['ROLLING_MEAN'] = df.groupby(['a', 'b'])['c'].transform(lambda x: x.rolling(3).mean())
验证预期结果
构造符合预期示例的测试数据:
df = pd.DataFrame({ 'a': ['x', 'y', 'x', 'x', 'x', 'y', 'y', 'x'], 'b': ['r', 's', 'r', 'r', 'r', 's', 'r', 'r'], 'c': [1, 2, 3, 4, 5, 6, 7, 8] }) # 计算分组滚动均值 df['ROLLING_MEAN'] = df.groupby(['a', 'b'])['c'].transform(lambda x: x.rolling(3).mean()) # 筛选x-r分组 print(df[(df['a'] == 'x') & (df['b'] == 'r')])
输出结果:
a b c ROLLING_MEAN 0 x r 1 NaN 2 x r 3 NaN 3 x r 4 2.666667 4 x r 5 4.000000 7 x r 8 5.666667
完全符合预期的分组滚动均值计算结果。
内容的提问来源于stack exchange,提问作者Nicolas Gervais
相关产品推荐
相关产品推荐

