如何用Pandas计算带偏移的球队主场累计得分?
问题:计算球队截至当前比赛的主场累计得分(不含当前比赛)
我正在开发一个预测球队得分的机器学习模型,需要新增一列来追踪每支球队**截至当前比赛(不含当前行对应比赛)**的主场累计得分。我能计算普通的累计总和,但需要对累计值进行偏移以满足需求。以下是数据集示例及期望的cumulative列,我写出了计算累计总和的Pandas代码,但尝试用shift实现偏移的代码结果不符合预期,寻求正确实现方法。
数据集示例
| game_id | game_date | home_id | home_score | cumulative |
|---|---|---|---|---|
| 718730 | 2023-04-03 | 145 | 3 | 0 |
| 718695 | 2023-04-05 | 145 | 7 | 3 |
| 718687 | 2023-04-06 | 145 | 6 | 10 |
| 718683 | 2023-04-06 | 109 | 2 | 0 |
| 718671 | 2023-04-07 | 109 | 6 | 2 |
| 718656 | 2023-04-08 | 109 | 12 | 8 |
现有代码(计算普通累计总和)
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
相关产品推荐
相关产品推荐

