所以我有 5 个来自 FIFA 13-17 的评分前 80 名球员的数据帧,每个数据帧都包含球员姓名、评分和俱乐部。我的最终目标是将所有这些数据集合并在一起,这样我就可以每年对每个玩家进行评分,如果他们没有做到,则为空值。显然,有些球员并不是每年都进入前 80 名,即:退休。
这是三个数据帧的片段。

FIFA18
Name Overall Club0 Cristiano Ronaldo 94 Real Madrid CF1 L. Messi 93 FC Barcelona2 Neymar 92 FC Barcelona3 L. Suárez 92 FC Barcelona4 M. Neuer 92 FC Bayern Munich5 De Gea 90 Manchester United6 R. Lewandowski 90 FC Bayern Munich7 J. Boateng 90 FC Bayern Munich8 G. Bale 90 Real Madrid CF9 Z. Ibrahimović 90 Manchester United10 T. Courtois 89 Chelsea
FIFA 13
Name Overall Club0 L. Messi 94 FC Barcelona1 Cristiano Ronaldo 92 Real Madrid CF2 F. Ribéry 90 FC Bayern Munich3 Xavi 90 FC Barcelona4 Iniesta 90 FC Barcelona5 N. Vidić 89 Manchester United6 W. Rooney 89 Manchester United7 Casillas 89 Real Madrid CF8 David Silva 88 Manchester City9 Falcao 88 Atlético Madrid10 Z. Ibrahimović 88 Paris Saint-Germain
发生这种情况的一个例子可能是已经退休的 N. Vidić。

我的目标表是这个
Name FIFA17 FIA13 Club0 Cristiano Ronaldo 94 92 Real Madrid CF1 L. Messi 93 94 FC Barcelona2 Neymar 92 83 FC Barcelona3 L. Suárez 92 86 FC Barcelona4 M. Neuer 92 87 FC Bayern Munich5 De Gea 90 82 Manchester United6 R. Lewandowski 90 80 FC Bayern Munich7 J. Boateng 90 84 FC Bayern Munich8 G. Bale 90 86 Real Madrid CF9 Z. Ibrahimović 90 88 Manchester United10 T. Courtois 89 83 Chelsea11 F. Ribéry 86 90 FC Bayern Munich12 Xavi 0 90 FC Barcelona13 Iniesta 88 90 FC Barcelona14 N. Vidić 0 89 Manchester United15 W. Rooney 0 89 Manchester United16 Casillas 0 89 Real Madrid CF17 David Silva 87 88 Manchester City18 Falcao 0 88 Atlético Madrid
我是 python 和 pandas 的新手,但我尝试过使用 join 和 merge 但它似乎总是使用每个表的索引而不是唯一的名称。

任何帮助将不胜感激!

最佳答案

这是通过 pd.concatpivot_table 的一种方式。它假设您能够将数据帧放入字典中,该字典可以是任意长度。

该解决方案还涉及多个俱乐部,仅保留最新的俱乐部。

dfs = {13: df13, 18: df18}

df = pd.concat([dfs[k].assign(Year=k) for k in dfs])

club_map = df.sort_values('Year', ascending=False)\
             .drop_duplicates('Name')\
             .set_index('Name')['Club']

df['Club'] = df['Name'].map(club_map)

res = df.pivot_table(index=['Name', 'Club'], columns='Year',
                     values='Overall', aggfunc=np.sum, fill_value=0)\
        .reset_index().rename_axis(None, axis='columns')

结果
                 Name               Club  13  18
0            Casillas     Real Madrid CF  89   0
1   Cristiano Ronaldo     Real Madrid CF  92  94
2         David Silva    Manchester City  88   0
3              De Gea  Manchester United   0  90
4           F. Ribéry   FC Bayern Munich  90   0
5              Falcao    Atlético Madrid  88   0
6             G. Bale     Real Madrid CF   0  90
7             Iniesta       FC Barcelona  90   0
8          J. Boateng   FC Bayern Munich   0  90
9            L. Messi       FC Barcelona  94  93
10          L. Suárez       FC Barcelona   0  92
11           M. Neuer   FC Bayern Munich   0  92
12           N. Vidić  Manchester United  89   0
13             Neymar       FC Barcelona   0  92
14     R. Lewandowski   FC Bayern Munich   0  90
15        T. Courtois            Chelsea   0  89
16          W. Rooney  Manchester United  89   0
17               Xavi       FC Barcelona  90   0
18     Z. Ibrahimović  Manchester United  88  90

关于python - 合并多个数据帧,其中某些行不相同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49319227/

10-12 21:31