如何使用Pandas的groupby计算滚动求和?以NBA球队胜场为例
NBA球队两年周期胜场滚动求和实现
不需要用循环,结合groupby和rolling就能高效实现,而且能自动处理多球队的情况,比循环性能好很多。
步骤1:准备示例数据
import pandas as pd df = pd.DataFrame({ 'Team': ['Hawks', 'Hawks', 'Hawks', 'Hawks', 'Hawks'], 'Season': [1970, 1971, 1972, 1973, 1974], 'Wins': [40, 34, 30, 46, 42] })
步骤2:计算滚动胜场和
通过groupby('Team')确保每个球队的计算独立,再用rolling(2).sum()计算连续两个赛季的胜场总和:
# 按球队分组计算滚动2赛季胜场和,重置索引避免多级索引问题 df['Two_Season_Wins'] = df.groupby('Team')['Wins'].rolling(2).sum().reset_index(drop=True)
步骤3:生成两年周期标签
为了明确对应时段,把当前赛季和下一个赛季拼接成周期标签:
df['Season_Period'] = df['Season'].astype(str) + '-' + df['Season'].shift(-1).astype(str)
步骤4:整理结果
过滤掉最后一行(没有下一个赛季配对的无效数据),并保留需要的列:
result = df.dropna(subset=['Season_Period'])[['Team', 'Season_Period', 'Two_Season_Wins']]
最终结果
运行后result的输出如下:
| Team | Season_Period | Two_Season_Wins |
|---|---|---|
| Hawks | 1970-1971 | 74.0 |
| Hawks | 1971-1972 | 64.0 |
| Hawks | 1972-1973 | 76.0 |
| Hawks | 1973-1974 | 88.0 |
这种方法完全避免了循环,利用Pandas的向量化操作,数据量越大优势越明显,同时groupby保证了多球队场景下每个球队的滚动计算不会互相干扰。
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

