python pandas 创建数据框连胜

python pandas create dataframe winning streak

我需要创建 'winning streak' 列。 例如, 我有如下数据。具有最大值的列获胜。

AA      BB      CC
5.95    5.95    0
0       -2.35   2.35
-0.6    -0.6    -0.6
-2.35   2.35    0
-1.6    1.6     -1.6
-1.25   1.25    1.25
1.85    0       -1.85
1.3     0       -1.3
-1.7    1.7     -1.7
0       0.25    0.25

并且需要为每个创建 "winning streak; how many times win cosecutively" 列,如下所示。

AA      BB      CC      CW_AA   CW_BB   CW_CC
5.95    5.95    0       1       1       0
0       -2.35   2.35    0       0       1
-0.6    -0.6    -0.6    1       1       2
-2.35   2.35    0       0       2       0
-1.6    1.6     -1.6    0       3       0
-1.25   1.25    1.25    0       4       1
1.85    0       -1.85   1       0       0
1.3     0       -1.3    2       0       0
-1.7    1.7     -1.7    0       1       0
0       0.25    0.25    0       2       1

我试过使用 "itertools" 库 (groupby) 来实现,但还不行。 有人可以帮助我吗?

pd.DataFrame({'AA':[5.95, 0, -0.6, -2.35, -1.6, -1.25, 1.85, 1.3, -1.7, 0],
        'BB':[5.95, -2.35, -0.6, 2.35, 1.6, 1.25, 0, 0, 1.7, 0.25],
        'CC':[0, 2.35, -0.6, 0, -1.6, 1.25, -1.85, -1.3, -1.7, 0.25]})

使用:

a = df.eq(df.max(axis=1), axis=0)
b = a.cumsum()
df = b - b.where(~a).ffill().fillna(0).astype(int)
print (df)
   AA  BB  CC
0   1   1   0
1   0   0   1
2   1   1   2
3   0   2   0
4   0   3   0
5   0   4   1
6   1   0   0
7   2   0   0
8   0   1   0
9   0   2   1

解释:

  1. 首先将所有列 eq 与每行 max 进行比较
  2. 计算连续 True 秒,用 cumsum
  3. 减去累积总和