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

Pandas按分组计算DataFrame当前行之前所有行VALUE平均值的实现方法

Pandas按分组计算历史行平均值实现方案

实现思路

要实现按ID分组后,每行RESULT等于分组内当前行之前所有历史行VALUE的平均值,核心要用到Pandas的**分组扩展窗口(expanding window)**功能,配合偏移操作即可高效实现,全程为矢量化运算,大数据量下性能远优于自定义循环方案。

前置注意事项

  • 计算前必须先按ID和DATE字段升序排序,确保行顺序符合时间先后逻辑,否则历史行的判断会出错

完整实现代码

import pandas as pd
import numpy as np

# 构造测试数据
list_of_tuples = [('A', '2021-01-01', 1, np.nan),
                  ('A', '2021-01-02', 2, 1),
                  ('A', '2021-01-03', 3, 1.5),
                  ('A', '2021-01-04', 4, 2),
                  ('A', '2021-01-05', 5, 2.5),
                  ('B', '2021-01-01', 1, np.nan),
                  ('B', '2021-01-02', 2, 1),
                  ('B', '2021-01-03', 3, 1.5)]
df = pd.DataFrame.from_records(data=list_of_tuples, columns=['ID', 'DATE', 'VALUE', 'EXPECTED_RESULT'])

# 第一步:按ID和日期排序,保证时间顺序
df = df.sort_values(['ID', 'DATE']).reset_index(drop=True)

# 第二步:核心计算,矢量化操作性能最优
df['RESULT'] = df.groupby('ID')['VALUE']\
                 .expanding()\
                 .mean()\
                 .reset_index(level=0, drop=True)\
                 .shift(1)

print(df)

代码逻辑说明

  • groupby('ID'):按ID字段对数据分组,每个分组单独计算
  • expanding().mean():计算从分组第一行到当前行的VALUE平均值,包含当前行
  • shift(1):将计算结果向下偏移1行,最终得到的就是当前行之前所有历史行的平均值,分组第一行偏移后自动变为NaN,完全符合需求

输出验证

运行后得到的RESULT字段和示例预期结果完全一致:

IDDATEVALUEEXPECTED_RESULTRESULT
A2021-01-011NaNNaN
A2021-01-0221.01.0
A2021-01-0331.51.5
A2021-01-0442.02.0
A2021-01-0552.52.5
B2021-01-011NaNNaN
B2021-01-0221.01.0
B2021-01-0331.51.5

内容的提问来源于stack exchange,提问作者Любовь Пономарева

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:45:04