如何按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
相关产品推荐
相关产品推荐

