我有一组体育比赛的数据,其形式如下:
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})
df
我想计算 P1 和 P2 的持续连胜。然而,当我这样做时,当 P_win == 0 时,连胜不会重置。
我用来计算条纹的代码是:
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()
发生的情况是,每当一个 streak 结束时,0 就会成功输入到 streak 列中,但 streak 会从之前的值开始,如图所示:
非常感谢任何帮助取消这个问题!
您可以根据
P1_win
更改的时间将数据框分组:
g = df['P1_win'].ne(df['P1_win'].shift()).cumsum()
您还可以屏蔽
P1_win
为 0
的情况:
m = df['P1_win'].ne(0)
现在,当
np.where
为 m
时,您可以使用 True
为每组分配累积计数:
df['P1_win_streak'] = np.where(m, df.groupby(g).cumcount() + 1, 0)
输出:
winner loser P1 P2 P1_win P1_win_streak
0 A B A B 1 1
1 A C A C 1 2
2 B A A B 0 0
3 C A A C 0 0
4 A B A B 1 1
5 C A A C 0 0
6 C B B C 0 0
7 B C B C 0 0