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

如何在Pandas中为不同Player子集创建2日滚动均值列?

解决Pandas按Player分组计算2日滚动均值的问题

问题描述

我有如下结构的Pandas DataFrame:

PLAYERDATESCOREGAME
Albert2020-08-1210X
Barney2020-08-12100X
Charlie2020-08-121000X
Albert2020-08-1320X
Barney2020-08-13200X
Charlie2020-08-132000X
Albert2020-08-1430Y
Barney2020-08-14300Y
Charlie2020-08-143000Y
Albert2020-08-1540Y
Barney2020-08-15400Y
Charlie2020-08-154000Y
Albert2020-08-1650Z
Barney2020-08-16500Z
Charlie2020-08-165000Z
Albert2020-08-1760Z
Barney2020-08-17600Z
Charlie2020-08-176000Z

我想要为每个Player子集创建一个新的2日得分均值列,预期结果如下:

PLAYERDATESCOREGAME2-DAY AVG
Albert2020-08-1210XNaN
Barney2020-08-12100XNaN
Charlie2020-08-121000XNaN
Albert2020-08-1320X15
Barney2020-08-13200X150
Charlie2020-08-132000X1500
Albert2020-08-1430Y25
Barney2020-08-14300Y250
Charlie2020-08-143000Y2500
Albert2020-08-1540Y35
Barney2020-08-15400Y350
Charlie2020-08-154000Y3500
Albert2020-08-1650Z45
Barney2020-08-16500Z450
Charlie2020-08-165000Z4500
Albert2020-08-1760Z55
Barney2020-08-17600Z550
Charlie2020-08-176000Z5500

我已尝试过groupby()结合rolling.mean(2)函数以及Python条件语句的多种组合,但均未成功。请问在Pandas中有什么巧妙的实现方法吗?


解决方案

其实核心就是按PLAYER分组后,对SCORE列应用窗口大小为2的滚动均值,只要注意几个细节就能搞定:

  1. 先把DATE列转为datetime类型,确保时间排序逻辑正确(哪怕你的数据已经排好序,这也是个好习惯)
  2. 滚动计算时设置min_periods=2,保证只有当窗口内有至少2条数据时才返回均值,否则返回NaN,正好对应第一行的预期结果

下面是完整的可运行代码:

import pandas as pd

# 构造原始数据
data = {
    'PLAYER': ['Albert', 'Barney', 'Charlie']*6,
    'DATE': ['2020-08-12', '2020-08-12', '2020-08-12',
             '2020-08-13', '2020-08-13', '2020-08-13',
             '2020-08-14', '2020-08-14', '2020-08-14',
             '2020-08-15', '2020-08-15', '2020-08-15',
             '2020-08-16', '2020-08-16', '2020-08-16',
             '2020-08-17', '2020-08-17', '2020-08-17'],
    'SCORE': [10, 100, 1000, 20, 200, 2000, 30, 300, 3000,
              40, 400, 4000, 50, 500, 5000, 60, 600, 6000],
    'GAME': ['X','X','X','X','X','X','Y','Y','Y','Y','Y','Y','Z','Z','Z','Z','Z','Z']
}

df = pd.DataFrame(data)

# 1. 转换DATE列为datetime类型
df['DATE'] = pd.to_datetime(df['DATE'])

# 2. 按玩家分组计算滚动2期均值
df['2-DAY AVG'] = df.groupby('PLAYER')['SCORE'].rolling(window=2, min_periods=2).mean().reset_index(level=0, drop=True)

# 输出结果
print(df)

关键细节解释

  • groupby('PLAYER'):确保每个玩家的计算独立进行,不会和其他玩家的数据混在一起
  • rolling(window=2, min_periods=2):窗口大小设为2,min_periods=2要求窗口内必须有2条数据才计算均值,否则返回NaN
  • reset_index(level=0, drop=True):分组后的滚动结果会带有分组索引,这一步是去掉分组索引,让计算结果能和原DataFrame完美对齐

运行这段代码后,你就能得到和预期完全一致的结果啦!之前尝试失败大概率是没处理好分组后的索引对齐,或者没设置min_periods导致第一行没有返回NaN。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:47:57