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

如何用Pandas按球员计算NFL数据中Points列的3周滚动平均值

解决按球员分组计算3周滚动平均的问题

你的代码问题出在reset_index(drop=True)上:这个操作会完全丢弃分组后的层级索引,导致滚动平均结果的索引和原DataFrame的索引不匹配,最终赋值时数据错位,看起来像是全局而非分组计算的结果。

正确步骤:

  1. 先排序数据:确保每个球员的记录按周数升序排列,这是滚动计算的前提(否则会出现时间顺序混乱的错误)。
  2. 分组计算滚动平均:保留原行索引,只丢弃分组的层级索引,确保结果能正确对应到原数据的每一行。
  3. 填充前两周的NaN值:因为3周滚动平均在球员的前两周会返回NaN,我们用当周的Points值填充这些位置,满足“前两周返回当周数值,第三周及以后返回最近3周平均”的需求。

完整代码:

# 按球员和周数排序,保证滚动计算的时间顺序正确
qbPast = qbPast.sort_values(['Player', 'Week'])

# 分组计算3周滚动平均,min_periods=3表示仅当有3个及以上数据时计算平均,否则返回NaN
qbPast['Rolling_3wk'] = qbPast.groupby('Player')['Points'].rolling(window=3, min_periods=3).mean().reset_index(level=0, drop=True)

# 用当周Points填充前两周的NaN,得到最终的平均值列
qbPast['Avg'] = qbPast['Rolling_3wk'].fillna(qbPast['Points'])

# 可选:删除中间辅助列
qbPast = qbPast.drop('Rolling_3wk', axis=1)

验证逻辑:

以你举例的球员A得分序列[20, 30, 40, 30, 40]为例:

  • 周1:Rolling_3wk为NaN,填充后Avg=20
  • 周2:Rolling_3wk为NaN,填充后Avg=30
  • 周3:(20+30+40)/3=30,Avg=30
  • 周4:(30+40+30)/3≈33.3,Avg≈33.3
  • 周5:(40+30+40)/3≈36.7,Avg≈36.7
    完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:50:29