Pandas 23.0中按id分组计算滚动均值的DataFrame实现问询
高效实现按ID的累积均值计算
你的需求其实是计算每个ID分组下的累积算术平均值——也就是每个ID的每一行,取从首次出现到当前行的所有value的平均值,Pandas有非常高效的内置方法可以实现,完全不需要用字典循环,代码更简洁,性能也会好很多,尤其是数据量大的时候。
最优实现方案
直接利用Pandas的groupby结合expanding().mean()扩展窗口函数,一步到位:
import pandas as pd # 读取CSV数据 dat = pd.read_csv('file.csv') # 按ID分组,计算每个分组内value的累积均值 dat['mean'] = dat.groupby('id')['value'].expanding().mean().reset_index(level=0, drop=True) # 保存结果到新CSV dat.to_csv('file2.csv', index=False)
代码解释
groupby('id'):将数据按id分组,每个ID的行单独处理expanding().mean():对每个分组的value列计算扩展窗口均值——窗口从该分组的第一行开始,逐步扩大到当前行,所以每个位置的值就是从该ID首次出现到当前行的所有value的平均值,完全符合你要求的"首次出现的id均值为自身value"的规则reset_index(level=0, drop=True):移除分组产生的多级索引,让计算结果和原DataFrame的行对齐,直接赋值给新的mean列
验证结果
运行后生成的file2.csv内容和你期望的完全一致:
id,time,value,mean 1,22:10:01,10,10.0 2,22:10:02,20,20.0 3,22:10:03,30,30.0 2,22:10:04,40,30.0 1,22:10:05,50,30.0
额外说明
如果你的原始数据不是按time顺序排列的,建议先按id和time排序,确保累积计算的顺序正确:
dat = dat.sort_values(['id', 'time'])
对比你的原方法
你用字典循环的方式虽然可行,但Pandas的向量化操作是基于C实现的,在数据量较大(比如几万行以上)时,速度会比循环快几十甚至上百倍,而且代码更简洁易读,维护成本更低。
内容的提问来源于stack exchange,提问作者Als
相关产品推荐
相关产品推荐

