首页 > 解决方案 > 如何获得连续投篮次数而不是标准累积总和?

问题描述

我有一个数据集,其中包含每个用户在游戏中的投篮细节。这是斯诺克的数据集,因此一名球员将球投进篮筐,然后他继续比赛,直到他错过了等等。我需要计算玩家在游戏 中连续投篮的最高次数。

这是数据集

Game_id                       Player ID
5d6576aab80c990500e3ce5a        2ff211
5d6576aab80c990500e3ce5a        2ff250
5d6576aab80c990500e3ce5a        2ff211
5d6576aab80c990500e3ce5a        2ff211
     .  .   .                    ...

我找到了一种使用累积求和移位方法创建子组的解决方案,但它的作用是为您提供比赛期间所有投篮次数的总和。

# where f is the dataframe.
f['subgroup'] = (f['pSId'] != f['pSId'].shift(1)).cumsum()
f.groupby('subgroup',as_index=False).apply(lambda x: (x['pSId'].head(1), x.shape[0]))

对于每个游戏 ID,我需要在不给下一个玩家机会的情况下获得玩家的最大投篮次数。如何获得连续投篮次数而不是标准累积总和?

结果应该是这样的: -

Game_id                    Player ID    Maximum Continuous Shots
5d6576aab80c990500e3ce5a    2ff211        5
5d6576aab80c990500e3ce5a    2ff250        2
5d6576aa35c80305060c4a32    2f7a5b        5
5d6576aa35c80305060c4a32    2f0847        6

标签: pythonpandasdataset

解决方案


你可以这样做:

df['Streak'] =df['Player ID'].groupby((df['Player ID'] != df['Player ID'].shift()).cumsum()).cumcount() + 1

df.head()

                    Game_id Player ID  Streak
0  5d6576aab80c990500e3ce5a    2ff211       1
1  5d6576aab80c990500e3ce5a    2ff250       1
2  5d6576aab80c990500e3ce5a    2ff211       1
3  5d6576aab80c990500e3ce5a    2ff211       2
4  5d6576aab80c990500e3ce5a    2ff211       3

然后将其分组并获得最大值:

df.groupby(['Game_id','Player ID']).max().reset_index()

                    Game_id Player ID  Streak
0  5d6576aa35c80305060c4a32    2f0847       6
1  5d6576aa35c80305060c4a32    2f7a5b       5
2  5d6576aab80c990500e3ce5a    2ff211       5
3  5d6576aab80c990500e3ce5a    2ff250       2

您也可以查看这篇文章: https ://predictivehacks.com/count-the-consecutive-events-in-python/


推荐阅读