修复DataFrame中P1/P2连续获胜场次计算的重置失效问题
问题:计算P1实时连续获胜场次(连胜重置异常)
数据集
winner = ['A', 'A', 'B', 'C', 'A', 'C', 'C', 'B'] loser = ['B', 'C', 'A', 'A', 'B', 'A', 'B', 'C'] P1 = ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B'] P2 = ['B', 'C', 'B', 'C', 'B', 'C', 'C', 'C'] P1_win = [ 1, 1, 0, 0, 1, 0, 0, 0] df = pd.DataFrame({'winner': winner, 'loser': loser, 'P1':P1, 'P2':P2, 'P1_win':P1_win})
需求
计算P1的实时连续获胜场次,要求当P1_win=0(P1输掉比赛)时,连胜计数重置,后续P1获胜时从1重新开始累加。
原有代码及问题
原有代码尝试计算连胜,但存在逻辑错误:
condition = df.P1_win.eq(0) df['Reset'] = condition.groupby(df.P1_win).cumsum() #reset need to be 0. If P_win == 0, reset the line df['P1_win_Streak'] = df.P1_win.mask(condition, 0).groupby([df.winner, df.Reset]).cumsum()
问题现象:连胜结束时P1_win_Streak会填入0,但后续P1获胜时,连胜会从之前的累计值继续累加,未正确重置。
解决方案
正确代码
# 按P1分组,计算每组内的连胜分段:当P1_win与前一场结果不同时,生成新的分段标识 df['streak_group'] = df.groupby('P1')['P1_win'].apply(lambda x: x.ne(x.shift()).cumsum()) # 在每个P1+分段内累加获胜次数,输场时连胜设为0 df['P1_win_Streak'] = df.groupby(['P1', 'streak_group'])['P1_win'].cumsum() df['P1_win_Streak'] = df['P1_win_Streak'].where(df['P1_win'] == 1, 0)
代码说明
- 按P1分组:确保跟踪的是同一个参赛方(P1)的连胜情况,避免不同P1的连胜数据混淆。
- 生成连胜分段:通过
x.ne(x.shift()).cumsum()在每个P1组内识别连胜中断点——只要当前场次的P1_win结果和上一场不同,就生成新的分段编号,让连续胜场或败场归为同一分段。 - 计算并修正连胜值:在每个分段内累加P1_win的值,再通过
where将败场的连胜值强制设为0,胜场的连胜则从1开始重新累计。
运行结果
处理后的df中P1_win_Streak列结果为:[1, 2, 0, 0, 1, 0, 0, 0],符合连胜重置的需求。
内容的提问来源于stack exchange,提问作者Lavacave
相关产品推荐
相关产品推荐

