如何为分组数据计算带偏移的累积和(当前行不包含自身值的累计和)

作者:袖梨 2026-07-25

本文介绍在 pandas 中为按组(如球队 id)计算“滞后型”累积和的方法——即每个组内,当前行的累积值等于该组此前所有行(不含当前行)的和,常用于机器学习特征工程中的时序状态建模。

本文介绍在 pandas 中为按组(如球队 id)计算“滞后型”累积和的方法——即每个组内,当前行的累积值等于该组此前所有行(不含当前行)的和,常用于机器学习特征工程中的时序状态建模。

在构建体育赛事预测模型(如球队得分预测)时,一个关键特征是:某队在当前主场比赛前的历史主场总得分。这要求我们对 home_score 按 home_id 分组后,计算不包含当前行的累积和(即“向前偏移一位”的累积和),而非标准的 cumsum()(含自身)。直接使用 groupby(...).cumsum() 会将当前得分计入结果,而我们需要的是“截至上一场的累计值”。

正确实现方式是:在分组内先计算累积和,再整体下移一行(shift(1)),最后填充首行为 0 并转为整型。推荐代码如下:

data['cumulative'] = (data.groupby('home_id')['home_score']                      .transform(lambda x: x.cumsum().shift(1))                      .fillna(0)                      .astype(int))

✅ 关键点解析:

  • groupby('home_id') 确保按球队独立计算;
  • transform(...) 保持原始索引对齐,避免 apply 可能引发的索引错位;
  • x.cumsum().shift(1) 先累加再下移:[3,7,6] → [3,10,16] → [NaN,3,10],完美匹配目标(第 1 行为 0,第 2 行为 3,第 3 行为 10);
  • fillna(0) 将每组首行的 NaN 替换为 0(因无历史数据);
  • astype(int) 消除浮点型 0.0,保证列类型整洁。

⚠️ 常见错误警示:
不要嵌套 shift() 和 cumsum() 的顺序(如 shift().cumsum()),这会导致跨组污染或逻辑错乱;也不建议用 groupby(...).shift().cumsum(),它先整体偏移再累加,破坏了分组边界。

? 进阶提示:若数据未按时间排序,务必在计算前执行 data.sort_values(['home_id', 'game_date'], inplace=True),确保累积逻辑基于真实比赛时序。此步骤虽未显式出现在示例中,但在实际建模中不可或缺。

相关文章

精彩推荐