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

如何在Pandas中按条件生成累计列:自进球日起天数统计

修正Pandas中“Days since goal”列的计数逻辑

原代码的问题在于cumcount()默认从0开始计数,且未区分进球前(blocks=0)的情况。以下是修正方案:

修正代码

import pandas as pd
import numpy as np

# 按球员分组,标记每个进球周期的分组ID
blocks = df['Goal'].eq("Yes").groupby(df['Player']).cumsum()
# 对每个进球周期从1开始计数,进球前的记录设为0
df['Days since goal'] = np.where(
    blocks == 0,
    0,
    df.groupby([df['Player'], blocks]).cumcount() + 1
)

逻辑说明

  1. blocks分组:df['Goal'].eq("Yes").groupby(df['Player']).cumsum() 会为每个球员的每一次进球生成递增的分组ID,进球前的所有行分组ID为0,每出现一次"Yes",后续行的分组ID加1。
  2. 计数调整:
    • 对于分组ID为0的行(进球前),直接赋值为0;
    • 对于有进球的分组(ID≥1),用cumcount()+1让计数从1开始(进球当天为1,之后每天递增1)。

替代写法(分步实现)

如果不想用numpy.where,可以分步处理:

blocks = df['Goal'].eq("Yes").groupby(df['Player']).cumsum()
# 先统一加1,再把进球前的行改回0
df['Days since goal'] = df.groupby([df['Player'], blocks]).cumcount() + 1
df.loc[blocks == 0, 'Days since goal'] = 0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:15:39