使用groupby按分组计算列截至当前行的累计平均值该如何实现?
代码问题说明
你原来的代码存在两个核心问题:
- 逻辑不匹配:你调用的
groupby.mean()是计算每个HorseId分组下所有FGrating的整体平均值,返回的结果只有N条(N等于不同HorseId的数量),而你需要的是分组内逐行累计的平均值,不是全组统一的平均值。 - 索引不匹配:直接把长度为N的分组聚合结果赋值给原表长度为M(M是原表总行数)的列时,Pandas会按照索引对齐赋值,大部分行因为索引匹配不上会被填充为缺失值,这就是你说的「仅部分数据计算正确」的原因。
正确实现方案
首先要确保你的数据已经按照你需要的顺序排序(累计平均值和行的先后顺序强相关,比如按比赛时间排序),之后用扩张窗口expanding完成分组累计均值计算即可,代码如下:
# 按HorseId分组,计算分组内从第一行到当前行的累计平均值 featured_data['Average FGrating'] = featured_data.groupby('HorseId')['FGrating']\ .expanding()\ .mean()\ .reset_index(level=0, drop=True)
代码说明:
expanding()会为分组内每一行创建一个包含当前行及之前所有行的窗口,计算每个窗口的平均值就是你要的累计平均值- 末尾的
reset_index(level=0, drop=True)是为了去掉分组生成的额外HorseId索引,让结果的索引和原表完全对齐,避免赋值时出现缺失值。
内容的提问来源于stack exchange,提问作者Bogdan Doicin
相关产品推荐
相关产品推荐

