pandas 如何根据比赛列中的数据获取球员的联赛ID

hmmo2u0o  于 2023-05-27  发布在  其他
关注(0)|答案(1)|浏览(76)

我有两个足球信息的数据框:

  • matches:单个匹配的信息。包含进行比赛的联赛ID、比赛日期、比赛赛季的列,并有22列球员ID(home_player_1home_player_2、... home_player_11away_player_1away_player_2,... away_player11),用于开始比赛的每个玩家。
  • player_attributes:随时间记录的单个玩家的属性信息。每个球员在每个赛季都有多个记录,因此每行都有一个date列,指示该行中的数据是何时记录的。这很重要,因为这意味着玩家ID列不是唯一索引。

我想在球员属性数据框中添加一个league_id列,这样我就可以知道在记录该行中的特定属性时,球员处于哪个联赛。
到目前为止我所做的:

  • 基于每行date列中的值,在播放器属性df中添加season
  • 创建了一个新的player_matches df,列为match_idplayer_idseasonleague_id。这个df中的每个match id都显示在22行中(一行表示开始比赛的每个球员的id)。

我使用这个player_matches df的目的是通过将球员id和赛季匹配到player_matches行,然后使用该行的联赛id值,来找到球员属性表中每行的联赛id。问题是我还没有找到一个有效的方法来做到这一点。球员属性df包含121 k行,球员匹配表包含321 k行,所以普通的简单索引/掩码/合并不起作用。我试着这样使用apply

def get_league_id(row):
    player_api_id = row['player_api_id']
    season = row['season']

    match_row = player_matches[(player_matches['player_api_id'] == player_api_id) & (player_matches['season'] == season)].iloc[0]
    league_id = match_row['league_id']

    return league_id

player_attributes.apply(get_league_id, axis=1)

然而,这给出了错误:“索引错误:单个位置索引器越界”。我注意到错误直到第13行才发生,所以基本上这段代码player_attributes.head(12).apply(get_league_id, axis=1)可以工作。
知道为什么会出现这个错误吗?或者你有一个替代的方法,将工作?

zaqlnxep

zaqlnxep1#

事实证明,实际上有一个有效的合并操作!:)

pd.merge(player_attributes, player_matches, left_on=['player_id', 'season'], right_on=['player_id', 'season'], how='left')

基本上,这是保留player_attributes中的所有行,并连接player_matches中共享相同player_idseason的行。这将从player_matches中的行添加league_id

相关问题