【问题标题】:Pandas - number of occurances of IDs from a column in one dataframe in several columns of a second dataframePandas - 在第二个数据帧的几列中,一个数据帧中的一列的 ID 出现次数
【发布时间】:2021-10-14 22:16:31
【问题描述】:

我是 python 和 pandas 的新手,正在尝试“边做边学”。

我目前正在使用两个足球/足球(取决于您来自哪里!)数据框:

  1. player_table 有几列,其中包括“player_name”和“player_id”
     player_id player_name        
  0  223       Lionel Messi        
  1  157       Cristiano Ronaldo   
  2  962       Neymar              
  1. match_table 也有几列,其中包括 'home_player_1'、'..._2'、'..._3' 等,以及对应的 'away_player_1'、'...2'、'。 .._3' 等等。这些列的内容是 player_id,这样您就可以通过他们各自的唯一 ID 来判断哪些 22 (2x11) 名球员参加了一场给定的比赛。

我将在这里发布一个 2 vs. 2 的示例,因为它同样有效:

     match_id  home_player_1  home_player_2  away_player_1  away_player_2
  0  321       223            852            729            853
  1  322       223            858            157            159
  2  323       680            742            223            412

我现在想做的是向 player_table 添加一个新列,它给出出现次数 - player_table['appearances'] 通过计算每个 player_id 在水平绑定的数据框 match_table 部分中提及的次数按(主队球员 1,客队球员 2)和垂直按(第一场比赛,最后一场比赛)

想要的结果:

     player_id player_name         appearances
  0  223       Lionel Messi        3
  1  157       Cristiano Ronaldo   1
  2  962       Neymar              0

来自其他编程语言,我认为我的标准解决方案是嵌套 for 循环,但我知道这在 python 中是不受欢迎的......

我尝试了几种解决方案,但都没有真正奏效,这似乎至少给出了“home_player_1”的出现次数

player_table['appearances'] = player_table['player_id'].map(match_table['home_player_1'].value_counts()) 

有没有办法扩展 map 函数以在数据框中包含几列?或者我是否必须将 22 列堆叠在一个新的数据框中,然后映射?还是 map 不是合适的功能?

非常感谢您的支持,谢谢! 菲利普

编辑:根据要求添加特定输入和所需输出

【问题讨论】:

标签: python-3.x pandas dataframe


【解决方案1】:

您可以做的是在 match_table 玩家列上使用 .melt()(这样它会将您的宽表变成单列的高/长表)。然后在那一列上做一个.value_counts。最后将其加入'player_id'列上的player_table

import pandas as pd

player_table = pd.DataFrame({'player_id':[223,157,962],
                             'player_name':['Lionel Messi','Cristiano Ronaldo','Neymar']})

match_table = pd.DataFrame({
        'match_id':[321,322,323],
        'home_player_1':[223,223,680],
        'home_player_2':[852,858,742],
        'away_player_1':[729,157,223],
        'away_player_2':[853,159,412]})


player_cols = [x for x in match_table.columns if 'player_' in x]
match_table[player_cols].value_counts(sort=True)

df1 = match_table[player_cols].melt(var_name='columns', value_name='appearances')['appearances'].value_counts(sort=True).reset_index(drop=False).rename(columns={'index':'player_id'})
appearances_df = df1.merge(player_table, how='right', on='player_id')[['player_id','player_name','appearances']].fillna(0)

输出:

print(appearances_df)
   player_id        player_name  appearances
0        223       Lionel Messi          3.0
1        157  Cristiano Ronaldo          1.0
2        962             Neymar          0.0

【讨论】:

    猜你喜欢
    • 2021-12-07
    • 1970-01-01
    • 2020-10-01
    • 1970-01-01
    • 2021-08-02
    • 2021-03-10
    • 2022-09-30
    • 1970-01-01
    • 2020-10-09
    相关资源
    最近更新 更多