python - 如何获得连续投篮次数而不是标准累积总和?
问题描述
我有一个数据集,其中包含每个用户在游戏中的投篮细节。这是斯诺克的数据集,因此一名球员将球投进篮筐,然后他继续比赛,直到他错过了等等。我需要计算玩家在游戏 中连续投篮的最高次数。
这是数据集:
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
解决方案
你可以这样做:
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/
推荐阅读
- java - 调用 MSSQL 存储过程时,Spring Boot Data @Transactional 不起作用
- amazon-web-services - Amazon ECS 任务,如何在 NodeJS 中获取公共 IP
- excel - 使用脚本字典后格式化文本
- spring-boot - 在“可执行 JAR”中包含和使用本机 lib 文件(.so、.dylib)
- go - 为什么 atomic.StoreUint32 优先于 sync.Once 中的正常分配?
- corda - 我可以将corda状态的部分字段暴露给同一网络中的另一个cordapp吗?
- excel - 我的循环(for next)有问题,我想不通?
- laravel - 如何从laravel中的关系表中获取特定列?
- python - 使用 pyinstaller 和 googleapiclient 将 py 转换为 exe
- c# - ASP.NET devexpress GridDataTextColumn 导出 excel 空值