如何在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 )
逻辑说明
- blocks分组:
df['Goal'].eq("Yes").groupby(df['Player']).cumsum()会为每个球员的每一次进球生成递增的分组ID,进球前的所有行分组ID为0,每出现一次"Yes",后续行的分组ID加1。 - 计数调整:
- 对于分组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
相关产品推荐
相关产品推荐

