【问题标题】:I want to join two dataframes on multiple keys and append the second dataframe to the suitable rows我想在多个键上加入两个数据帧并将第二个数据帧附加到合适的行
【发布时间】:2020-01-07 12:58:06
【问题描述】:

我有两个数据框,包括从 2009 年到 2019 年所有球队的 NBA 统计数据(30 支球队 * 10 个赛季 = 300 行)。我想通过将第二个 df 中的列添加到合适的 team_stat_by_season 行来加入他们。

唯一适合它们到行的键是“TEAM”和“MIN”。 这就是两个 df 的样子(以大大缩短的方式):

df1:
Team                 MIN        PTS         FGM
Orlando Magic       48.1        102.8       36.6
Phoenix Suns        48.5        102.1       38.1
Indiana Pacers      48.1        100.8       36.8
Orlando Magic       48.4        103.5       37.5

df2:
Team                 MIN        AST%        REB%
Phoenix Suns        48.5        1.61        52.9
Orlando Magic       48.1        1.54        49.8
Orlando Magic       48.4        1.70        50.6
Indiana Pacers      48.1        1.81        50.9

结果应该是这样的:

Team                 MIN        PTS          FGM        AST%        REB%
Orlando Magic       48.1        102.8       36.6        1.54        49.8
Phoenix Suns        48.5        102.1       38.1        1.61        52.9    
Indiana Pacers      48.1        100.8       36.8        1.81        50.9
Orlando Magic       48.4        103.5       37.5        1.70        50.6

我用下面的代码试了一下:

df_merged = pd.merge(left=df1,right=df2, how='left', left_on=['TEAM','MIN'], right_on=['TEAM','MIN'])

但不幸的是,它总是在某些部分返回 NaN(尽管我已经检查了数据类型并且它们都非常适合):

Team                 MIN        PTS         FGM         AST%        REB%
Orlando Magic       48.1        102.8       36.6        NaN         NaN
Phoenix Suns        48.5        102.1       38.1        NaN         NaN 
Indiana Pacers      48.1        100.8       36.8        NaN         NaN
Orlando Magic       48.4        103.5       37.5        NaN         NaN

我希望有人能在这个问题上帮助我,非常感谢你的帮助!

谢谢!

【问题讨论】:

  • 你可以用on代替left_on/right_on
  • 检查关键列中的空格和大写/小写的差异。例如用df1['Team'].str.strip()df1['Team'].str.upper() 解决它们

标签: python pandas dataframe join merge


【解决方案1】:

您是否尝试过使用完全外连接,这将提供您需要的结果。

将此保存为 df2.csv

Team,MIN,AST%,REB%
Phoenix Suns,48.5,1.61,52.9
Orlando Magic,48.1,1.54,49.8
Orlando Magic,48.4,1.70,50.6
Indiana Pacers,48.1,1.81,50.9

将此保存为 df1.csv

Team,MIN,PTS,FGM
Orlando Magic,48.1,102.8,36.6
Phoenix Suns,48.5,102.1,38.1
Indiana Pacers,48.1,100.8,36.8
Orlando Magic,48.4,103.5,37.5

下面是代码

df1 = pd.read_csv("df1.csv")
df2 = pd.read_csv("df2.csv")
pd.merge(df1, df2, how='outer', on=['Team','MIN'])

下面是输出。

             Team   MIN    PTS   FGM  AST%  REB%
0   Orlando Magic  48.1  102.8  36.6  1.54  49.8
1    Phoenix Suns  48.5  102.1  38.1  1.61  52.9
2  Indiana Pacers  48.1  100.8  36.8  1.81  50.9
3   Orlando Magic  48.4  103.5  37.5  1.70  50.6

【讨论】:

  • 感谢您的回复!但是如果我使用外部连接,它会像这样:
  • Team MIN PTS FGM AST% REB% <br/> Orlando Magic 48.1 102.8 36.6 NaN NaN Phoenix Suns 48.5 102.1 38.1 NaN NaN Indiana Pacers 48.1 100.8 36.8 NaN NaN Orlando Magic 48.4 103.5 37.5 NaN NaN Phoenix Suns 48.5 NaN NaN 1.61 52.9 Orlando Magic 48.1 NaN NaN 1.54 49.8 Orlando Magic 48.4 NaN NaN 1.70 50.6
  • 对不起,我刚加入stackoverflow,我不知道如何在评论部分显示上面的数据框。但问题是df2的行附加在底部df1。但是我要找的是将df2的每一行附加到合适行的末尾,这样加入的df的行数就和df1一样了。你能帮我解决这个问题吗?非常感谢!
【解决方案2】:

差不多了 :) 您需要在拼写“Team”时保持一致:在您的数据框中都是大写的,但在您的联接中却不是。

如下

pd.merge(left=df1,right=df2, how='left', on=['Team','MIN'])

你会得到

    Team    MIN     PTS     FGM     AST%    REB%
0   Magic   48.1    102.8   36.6    1.54    49.8
1   Suns    48.5    102.1   38.1    1.61    52.9
2   Pacers  48.1    100.8   36.8    1.81    50.9
3   Magic   48.4    103.5   37.5    1.70    50.6

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多