使用Pandas在多个列上进行左外连接多个数据框。

70

我刚接触DataFrame,想知道如何在多个表的多个列上执行类似于SQL中左连接(left outer join)的操作。

例如:

df1: 
Year    Week    Colour    Val1 
2014       A       Red      50
2014       B       Red      60
2014       B     Black      70
2014       C       Red      10
2014       D     Green      20

df2:
Year    Week    Colour    Val2
2014       A     Black      30
2014       B     Black     100
2014       C     Green      50
2014       C       Red      20
2014       D       Red      40

df3:
Year    Week    Colour    Val3
2013       B       Red      60
2013       C     Black      80
2013       B     Black      10
2013       D     Green      20
2013       D       Red      50

基本上,我想做的事情类似于这段SQL代码(请注意,df3没有按年份连接):

SELECT df1.*, df2.Val2, df3.Val3
FROM df1
  LEFT OUTER JOIN df2
    ON df1.Year = df2.Year
    AND df1.Week = df2.Week
    AND df1.Colour = df2.Colour
  LEFT OUTER JOIN df3
    ON df1.Week = df3.Week
    AND df1.Colour = df3.Colour

结果应该看起来像:

Year    Week    Colour    Val1    Val2    Val3
2014       A       Red      50    Null    Null
2014       B       Red      60    Null      60
2014       B     Black      70     100    Null
2014       C       Red      10      20    Null
2014       D     Green      20    Null    Null

我尝试使用合并和连接,但无法弄清如何在多个表格以及涉及多个联接时进行操作。请问有人可以帮我解决这个问题吗?

谢谢。


有关合并、连接和拼接 API 的各个方面和功能的更多信息,请参阅 Pandas Merging 101 - cs95
2个回答

109

分两步合并它们,先合并df1df2,再将结果合并到df3中。

In [33]: s1 = pd.merge(df1, df2, how='left', on=['Year', 'Week', 'Colour'])

我从df3中删除了year,因为您在最后的连接中不需要它。

In [39]: df = pd.merge(s1, df3[['Week', 'Colour', 'Val3']],
                       how='left', on=['Week', 'Colour'])

In [40]: df
Out[40]: 
   Year Week Colour  Val1  Val2 Val3
0  2014    A    Red    50   NaN  NaN
1  2014    B    Red    60   NaN   60
2  2014    B  Black    70   100   10
3  2014    C    Red    10    20  NaN
4  2014    D  Green    20   NaN   20

[5 rows x 6 columns]

1
非常感谢您的回答。由于我有相当多的数据框,所以我正在寻找一种快速将所有表格合并在一起的方法 - 类似于使用“join”,因为您可以在一步中连接多个表格。但是,我无法弄清楚如何在多个连接条件上执行此操作。如果没有更快的方法,我就会坚持您建议的方法 :) - user3311225
Pandas的join操作更偏向于关系代数而非关系演算,你需要按顺序指定步骤。SQL允许你一次性指定所有内容,查询引擎会决定生成结果的最佳步骤。 - ChuckCottrill

18

你也可以使用@TomAugspurger的简化版本来完成这个操作,方法如下:

df = df1.merge(df2, how='left', on=['Year', 'Week', 'Colour']).merge(df3[['Week', 'Colour', 'Val3']], how='left', on=['Week', 'Colour'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接