如何用Pandas按球员计算NFL数据中Points列的3周滚动平均值
解决按球员分组计算3周滚动平均的问题
你的代码问题出在reset_index(drop=True)上:这个操作会完全丢弃分组后的层级索引,导致滚动平均结果的索引和原DataFrame的索引不匹配,最终赋值时数据错位,看起来像是全局而非分组计算的结果。
正确步骤:
- 先排序数据:确保每个球员的记录按周数升序排列,这是滚动计算的前提(否则会出现时间顺序混乱的错误)。
- 分组计算滚动平均:保留原行索引,只丢弃分组的层级索引,确保结果能正确对应到原数据的每一行。
- 填充前两周的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
相关产品推荐
相关产品推荐

