如何计算数据帧中组内列中连续值的数目?

2024-06-10 11:49:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,里面有一个战士的所有战斗,战斗编号(例如,如果是他们的第一次,第二次,等等),以及他们是否赢得了战斗。我想计算一个战士在当前战斗之前获得的连续胜利数(即不包括他们是否赢得当前战斗)。我目前正在Spyder中使用Python3.7。你知道吗

假设我们有以下数据帧,其中win=1,如果战斗机赢得了战斗:

df = pd.DataFrame({'fighter' : ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'], 
                  'fight_number' :  ['1', '2', '3', '4', '1', '2', '3', '1', '2'],
                  'win' : [0, 0, 1, 1, 1, 1, 0, 1, 1]})
  fighter  fight_number  win
0       A             1     0
1       A             2     0
2       A             3     1
3       A             4     1
4       B             1     1
5       B             2     1
6       B             3     0
7       C             1     1
8       C             2     1

我知道,要计算所有行的连胜率,我可以使用以下方法实现建议的解决方案here

grouper = (df.win != df.win.shift()).cumsum()
df['streak'] = df.groupby(grouper).cumsum()

产生:

  fighter fight_number  win  streak
0       A            1    0       0
1       A            2    0       0
2       A            3    1       1
3       A            4    1       2
4       B            1    1       3
5       B            2    1       4
6       B            3    0       0
7       C            1    1       1
8       C            2    1       2

但我需要的是将这种方法应用于数据帧的子组(即每个战斗机),并且不将当前战斗的结果包括在连胜计数中。所以,我基本上是想让现在的战机在进入战斗状态时保持连胜。你知道吗

因此,本例中的目标输出为:

  fighter fight_number  win  streak
0       A            1    0       0
1       A            2    0       0
2       A            3    1       0
3       A            4    1       1
4       B            1    1       0
5       B            2    1       1
6       B            3    0       2
7       C            1    1       0
8       C            2    1       1

我很感激在这方面能得到的任何建议,因为我对Python还很陌生。你知道吗


Tags: 数据方法numberdfwin建议编号spyder
1条回答
网友
1楼 · 发布于 2024-06-10 11:49:22

我想出的一个解决方案是受jezrael之前发布(但已删除)的答案启发的:

grouper = (df.win != df.win.shift()).cumsum()
df['streak'] = df.groupby(['fighter', grouper]).cumsum()
df['streak'] = df.groupby('fighter')['streak'].shift(1).fillna(0)

产生目标输出:

  fighter fight_number  win  streak
0       A            1    0     0.0
1       A            2    0     0.0
2       A            3    1     0.0
3       A            4    1     1.0
4       B            1    1     0.0
5       B            2    1     1.0
6       B            3    0     2.0
7       C            1    1     0.0
8       C            2    1     1.0

它似乎也适用于其他测试示例:

df2 = pd.DataFrame({'fighter' : ['A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'], 
                  'fight number' :  ["1", "2", "3", "4", "5", "6", "1", "2", "3", "1", "2"],
                  'win' : [1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 1]}) 

grouper = (df2.win != df2.win.shift()).cumsum()
df2['streak'] = df2.groupby(['fighter', grouper]).cumsum()
df2['streak'] = df2.groupby('fighter')['streak'].shift(1).fillna(0)

   fighter fight number  win  streak
0        A            1    1     0.0
1        A            2    1     1.0
2        A            3    0     2.0
3        A            4    1     0.0
4        A            5    0     1.0
5        A            6    1     0.0
6        B            1    1     0.0
7        B            2    1     1.0
8        B            3    0     2.0
9        C            1    1     0.0
10       C            2    1     1.0

相关问题 更多 >