【问题标题】:Pandas left outer join multiple dataframes on multiple columns熊猫左外连接多个列上的多个数据框
【发布时间】:2014-03-14 05:38:27
【问题描述】:

我是使用 DataFrame 的新手,我想知道如何在一系列表的多个列上执行相当于左外连接的 SQL

例子:

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 没有加入 Year):

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

我尝试过使用合并和连接,但不知道如何在多个表上执行此操作以及何时涉及多个关节。有人可以帮我解决这个问题吗?

谢谢

【问题讨论】:

  • 有关merge、join和concat API的各个方面和功能的更多信息,请查看Pandas Merging 101

标签: python sql merge pandas


【解决方案1】:

也可以使用@TomAugspurger 答案的精简版来做到这一点,如下所示:

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

【讨论】:

    【解决方案2】:

    分两步合并它们,首先是df1df2,然后将结果合并到df3

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

    我从 df3 中删除了年份,因为您在最后一次加入时不需要它。

    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]
    

    【讨论】:

    • 非常感谢您的回答。由于我有很多数据框,我一直在寻找一种快速将表全部连接在一起的方法 - 类似于使用“连接”,因为您可以一步连接两个以上的表。但是,我无法弄清楚如何在多个连接条件下执行此操作。如果没有更快的方法可以做到这一点,我会坚持你的建议:)
    • pandas join 比关系演算更像是关系代数,你需要按顺序指定步骤。 SQL 允许您一起指定所有内容,查询引擎决定生成结果的最佳步骤。
    猜你喜欢
    • 2014-07-03
    • 2020-12-18
    • 2023-02-10
    • 1970-01-01
    • 2019-09-09
    • 2018-02-18
    相关资源
    最近更新 更多