python - Pandas 左外连接多个列上的多个数据框

标签 python sql merge pandas

我是使用 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

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

谢谢

最佳答案

分两步合并它们,首先是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]

关于python - Pandas 左外连接多个列上的多个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21786490/

相关文章:

python - 覆盖 Haystack 中的用户查询

python - 过滤 Pandas 数据框列时如何使用.le()和.ge()?

sql - 从同一列 X 中提取多个值,给定它们在 Y 列中的共享值

sql - SSIS 在更新期间挂起,有 300 万行

mysql - 检索每组中的最后一条记录 - MySQL

image - NSImage-drawAtPoint : Draws Too Small

merge - 如何将 XSD 架构与导入和包含合并到一个文件中?

python - 在共享虚拟主机服务器上使用 wsgi 和 virtualenv 部署 Django 项目,无需 root 访问权限

python - 将字符串拆分为均匀大小的 block

Mercurial - 内部异常 :local merge-patterns?