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

如何用Pandas计算带偏移的球队主场累计得分?

问题:计算球队截至当前比赛的主场累计得分(不含当前比赛)

我正在开发一个预测球队得分的机器学习模型,需要新增一列来追踪每支球队**截至当前比赛(不含当前行对应比赛)**的主场累计得分。我能计算普通的累计总和,但需要对累计值进行偏移以满足需求。以下是数据集示例及期望的cumulative列,我写出了计算累计总和的Pandas代码,但尝试用shift实现偏移的代码结果不符合预期,寻求正确实现方法。

数据集示例

game_idgame_datehome_idhome_scorecumulative
7187302023-04-0314530
7186952023-04-0514573
7186872023-04-06145610
7186832023-04-0610920
7186712023-04-0710962
7186562023-04-08109128

现有代码(计算普通累计总和)

import pandas as pd

data = pd.read_csv('game_data.csv')
data['home_cumulative'] = data.groupby('home_id')['home_score'].cumsum()

尝试的偏移代码(结果不符合预期)

data['home_offset'] = data.groupby('home_id')['home_score'].shift(periods = 1).cumsum().fillna(0)

解决方案

错误原因

你之前的代码错误在于:先对分组后的home_score做shift,然后直接调用全局的cumsum(),而不是在每个分组内进行累计求和,导致不同球队的累计值会被错误地叠加在一起。

正确实现方法

有两种可靠的实现方式:

方法1:先分组累计,再分组偏移

先计算每支球队的累计得分,再对每个分组的累计结果进行偏移,最后将空值填充为0:

import pandas as pd

data = pd.read_csv('game_data.csv')
# 1. 计算每支球队的主场累计得分(包含当前比赛)
data['home_cumulative'] = data.groupby('home_id')['home_score'].cumsum()
# 2. 对每个分组的累计得分进行偏移,得到不含当前比赛的累计值
data['cumulative'] = data.groupby('home_id')['home_cumulative'].shift(periods=1).fillna(0)

方法2:分组内先偏移再累计

直接在每个球队的分组内,先将得分偏移一行,再进行累计求和,最后填充空值:

import pandas as pd

data = pd.read_csv('game_data.csv')
data['cumulative'] = data.groupby('home_id')['home_score'].apply(lambda x: x.shift(1).cumsum()).fillna(0)

两种方法都能得到你期望的cumulative列结果,确保每支球队的累计得分仅包含当前比赛之前的所有主场得分。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:13:17