Pandas按索引分组计算扩展均值且保持行顺序的实现问题
Pandas按索引分组计算扩展均值且保持行顺序的实现问题
嗨,我来帮你搞定这个问题!你想要的是按索引(week)分组后,对每个组内的列计算扩展均值,同时严格保留原始数据的行顺序,对吧?你的尝试思路方向没错,但没加入分组逻辑,所以没法按索引区分计算,自然得不到想要的结果。
先帮你把原始数据的代码写出来,方便复现:
import pandas as pd # 构建你提供的df1 data = {'a': [47, 36, 29, -68, -12, 67], 'b': [19, 44, 46, -37, 90, 66]} df1 = pd.DataFrame(data, index=[9,9,10,10,10,9])
正确实现方案
核心思路是先按索引分组,在每个组内计算扩展均值,最后还原原始行顺序,具体代码如下:
# 1. 按索引分组,计算每组内的扩展均值 expanding_group_means = df1.groupby(level=0).expanding().mean().droplevel(0) # 2. 按照原df1的行顺序重新排列结果,保证顺序一致 final_result = expanding_group_means.loc[df1.index]
运行后输出的结果完全符合你的预期:
a b 9 47.0 19.0 9 41.5 31.5 10 29.0 46.0 10 -19.5 4.5 10 -17.0 33.0 9 50.0 43.0
代码解释
groupby(level=0):因为你的索引是单级的week,用level=0可以直接按索引分组,也可以写成groupby(df1.index),效果一致。expanding().mean():对每个分组内的数据逐行计算扩展均值——也就是每一行的值,是该组从第一行到当前行所有数据的平均值,比如最后一行索引9的b列,就是(19+44+66)/3=43。droplevel(0):分组后的结果会生成多层索引(分组索引+原索引),这里去掉第一层分组索引,只保留原始的week索引。loc[df1.index]:分组计算后的结果会默认按组排序(比如先所有索引9的行,再索引10的行),用原df1的索引顺序重新选取行,就能完美还原你原始数据的行顺序。
为什么你的尝试没生效
你写的df1[df1.index == df1.index].expanding().mean()其实等价于直接对整个df1计算全局扩展均值,没有按索引分组的逻辑,所以自然没法区分不同week的计算结果啦。
备注:内容来源于stack exchange,提问作者younggotti
相关产品推荐
相关产品推荐

