Python 如何计算数据帧中组内列中连续值的数量?
我有一个数据框,上面有一名战士的所有战斗、战斗编号(即,如果是他们的第一次、第二次等),以及他们是否赢得了战斗。我想计算一名战士在当前战斗之前获得的连续胜利数(即不包括他们是否赢得当前战斗)。我目前正在Spyder中使用Python 3.7 假设我们有以下数据帧,其中,如果战斗机赢得了战斗,win=1:Python 如何计算数据帧中组内列中连续值的数量?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,上面有一名战士的所有战斗、战斗编号(即,如果是他们的第一次、第二次等),以及他们是否赢得了战斗。我想计算一名战士在当前战斗之前获得的连续胜利数(即不包括他们是否赢得当前战斗)。我目前正在Spyder中使用Python 3.7 假设我们有以下数据帧,其中,如果战斗机赢得了战斗,win=1: df = pd.DataFrame({'fighter' : ['A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C'],
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 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非常陌生。我提出的一个解决方案的灵感来自于之前发布(但已删除)的一个答案: 这将生成目标输出:
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
值
2
对于index=6
是正确的?是的,因此它表明在战斗机B的第3场比赛中,他们赢得了最后两场比赛。
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