在R中为时序赛事数据添加玩家累计参赛场次字段(续)
需求说明
我有一份按时间顺序排列的赛事数据集,每条记录对应玩家在赛事中的一个动作。需要新增Games_Played字段,表示该时刻对应玩家的累计参赛场次。之前用分组+cumsum的方案在这里不生效,因为同一个赛事中玩家的多条动作记录会导致累计次数重复计算。
原数据集
| GAME_ID | EVENT_ID | EVENT_TYPE | PLAYER_ID |
|---|---|---|---|
| 1 | 1 | MADE_SHOT | 25 |
| 1 | 2 | MADE_SHOT | 22 |
| 1 | 3 | MISSED_SHOT | 25 |
| 1 | 4 | MADE_SHOT | 22 |
| 2 | 1 | MADE_SHOT | 25 |
| 2 | 2 | MADE_SHOT | 22 |
| 2 | 3 | MADE_SHOT | 30 |
| 3 | 1 | MISSED_SHOT | 25 |
| 3 | 2 | MADE_SHOT | 22 |
| 3 | 3 | MISSED_SHOT | 30 |
期望结果(含Games_Played字段)
| GAME_ID | EVENT_ID | EVENT_TYPE | PLAYER_ID | Games_Played |
|---|---|---|---|---|
| 1 | 1 | MADE_SHOT | 25 | 1 |
| 1 | 2 | MADE_SHOT | 22 | 1 |
| 1 | 3 | MISSED_SHOT | 25 | 1 |
| 1 | 4 | MADE_SHOT | 22 | 1 |
| 2 | 1 | MADE_SHOT | 25 | 2 |
| 2 | 2 | MADE_SHOT | 22 | 2 |
| 2 | 3 | MADE_SHOT | 30 | 1 |
| 3 | 1 | MISSED_SHOT | 25 | 3 |
| 3 | 2 | MADE_SHOT | 22 | 3 |
| 3 | 3 | MISSED_SHOT | 30 | 2 |
解决方案(Pandas实现)
核心思路是先对每个玩家的参赛赛事去重,再计算累计场次,最后关联回原数据,避免同赛事内多条记录重复累加:
import pandas as pd # 加载原数据 df = pd.DataFrame({ 'GAME_ID': [1,1,1,1,2,2,2,3,3,3], 'EVENT_ID': [1,2,3,4,1,2,3,1,2,3], 'EVENT_TYPE': ['MADE_SHOT','MADE_SHOT','MISSED_SHOT','MADE_SHOT','MADE_SHOT','MADE_SHOT','MADE_SHOT','MISSED_SHOT','MADE_SHOT','MISSED_SHOT'], 'PLAYER_ID': [25,22,25,22,25,22,30,25,22,30] }) # 步骤1:去重每个玩家的参赛赛事,保留唯一的PLAYER_ID + GAME_ID组合 player_games = df[['PLAYER_ID', 'GAME_ID']].drop_duplicates() # 步骤2:按玩家分组,对GAME_ID排序后计算累计参赛场次 player_games['Games_Played'] = player_games.groupby('PLAYER_ID').cumcount() + 1 # 步骤3:将结果合并回原数据集 result_df = df.merge(player_games, on=['PLAYER_ID', 'GAME_ID'], how='left') # 输出结果(保持原数据顺序) print(result_df)
代码说明
drop_duplicates():确保每个玩家的每个赛事只被计数一次,避免同赛事内多条动作记录导致累计次数错误groupby('PLAYER_ID').cumcount() + 1:对每个玩家的赛事按顺序计数,cumcount()从0开始,所以加1得到从1开始的累计场次merge():将计算好的累计场次关联回原数据,保证每条动作记录都能匹配到对应的Games_Played值
内容的提问来源于stack exchange,提问作者LesGrossman
相关产品推荐
相关产品推荐

