You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中为时序赛事数据添加玩家累计参赛场次字段(续)

需求说明

我有一份按时间顺序排列的赛事数据集,每条记录对应玩家在赛事中的一个动作。需要新增Games_Played字段,表示该时刻对应玩家的累计参赛场次。之前用分组+cumsum的方案在这里不生效,因为同一个赛事中玩家的多条动作记录会导致累计次数重复计算。

原数据集

GAME_IDEVENT_IDEVENT_TYPEPLAYER_ID
11MADE_SHOT25
12MADE_SHOT22
13MISSED_SHOT25
14MADE_SHOT22
21MADE_SHOT25
22MADE_SHOT22
23MADE_SHOT30
31MISSED_SHOT25
32MADE_SHOT22
33MISSED_SHOT30

期望结果(含Games_Played字段)

GAME_IDEVENT_IDEVENT_TYPEPLAYER_IDGames_Played
11MADE_SHOT251
12MADE_SHOT221
13MISSED_SHOT251
14MADE_SHOT221
21MADE_SHOT252
22MADE_SHOT222
23MADE_SHOT301
31MISSED_SHOT253
32MADE_SHOT223
33MISSED_SHOT302

解决方案(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 14:19:55