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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:39:21