You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

分组计算滚动均值遇索引错误及结果不符问题求助

解决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)

问题原因

  1. 索引不兼容:groupby.rolling()返回多层索引结果(外层为分组键,内层为原DataFrame索引),直接赋值时与原DataFrame的单层索引不匹配,导致报错。
  2. 结果错位:使用.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:17:43