使用 Python Pandas 计算数据框中持续的连胜

问题描述 投票:0回答:1

我有一组体育比赛的数据,其形式如下:

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 会从之前的值开始,如图所示:

在我的实际数据集中,它最终是这样的:

非常感谢任何帮助取消这个问题!

python pandas jupyter-notebook data-science
1个回答
0
投票

您可以根据

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
© www.soinside.com 2019 - 2024. All rights reserved.