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

修复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)

代码说明

  1. 按P1分组:确保跟踪的是同一个参赛方(P1)的连胜情况,避免不同P1的连胜数据混淆。
  2. 生成连胜分段:通过x.ne(x.shift()).cumsum()在每个P1组内识别连胜中断点——只要当前场次的P1_win结果和上一场不同,就生成新的分段编号,让连续胜场或败场归为同一分段。
  3. 计算并修正连胜值:在每个分段内累加P1_win的值,再通过where将败场的连胜值强制设为0,胜场的连胜则从1开始重新累计。

运行结果

处理后的df中P1_win_Streak列结果为:[1, 2, 0, 0, 1, 0, 0, 0],符合连胜重置的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:05:09