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

如何按ID分组计算DataFrame中Score的3日滚动均值?

按ID分组计算Score的3日滚动均值

问题描述

现有包含Date、ID、Score列的DataFrame,需要按ID分组,分别计算每个ID对应的Score的3日滚动均值。已知全局单列滚动均值的写法,但不知道如何按ID分组实现。

全局滚动均值写法:

df['RollingMean3']=df['Score'].rolling(3).mean()

示例数据:

Date        ID  Score
2022-01-02  1   1
2022-01-03  1   2
2022-01-04  1   1
2022-01-05  1   3
2022-01-02  2   5
2022-01-03  2   6
2022-01-04  2   7
2022-01-05  2   3

期望结果:

Date        ID  Score  ScoreRollingMean3
2022-01-02  1   1      NaN
2022-01-03  1   2      NaN
2022-01-04  1   1      1.33
2022-01-05  1   3      2
2022-01-02  2   5      NaN
2022-01-03  2   6      NaN
2022-01-04  2   7      6
2022-01-05  2   3      5.33

可复现代码:

import pandas as pd

df = pd.DataFrame({
    'Date':['2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05'],
    'ID':[1, 1, 1, 1, 2, 2, 2, 2],
    'Score':[1, 2, 1, 3, 5, 6, 7, 3]})

解决方案

通过groupby('ID')对数据按ID分组,再对每个分组的Score列应用滚动均值计算,即可实现每个ID独立的3日滚动均值:

# 按ID分组后计算3日滚动均值
df['ScoreRollingMean3'] = df.groupby('ID')['Score'].rolling(3).mean().reset_index(level=0, drop=True)

# 可选:保留两位小数,匹配期望结果格式
df['ScoreRollingMean3'] = df['ScoreRollingMean3'].round(2)

print(df)

代码说明

  • groupby('ID')['Score']:将数据按ID分组,仅保留每个组的Score列
  • .rolling(3).mean():对每个分组的Score列计算窗口大小为3的滚动均值
  • .reset_index(level=0, drop=True):移除分组产生的ID索引,将结果合并回原DataFrame对应行
  • .round(2):将结果保留两位小数,和示例期望结果格式一致

运行代码后输出结果与期望一致:

Date  ID  Score  ScoreRollingMean3
0  2022-01-02   1      1                NaN
1  2022-01-03   1      2                NaN
2  2022-01-04   1      1               1.33
3  2022-01-05   1      3               2.00
4  2022-01-02   2      5                NaN
5  2022-01-03   2      6                NaN
6  2022-01-04   2      7               6.00
7  2022-01-05   2      3               5.33

内容的提问来源于stack exchange,提问作者fjurt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:10:35