2014-02-14 150 views
33

我是新來使用數據框,我想知道如何執行SQL相當於左外上多列連接上的一系列表格熊貓上多列加入多個dataframes

例子:

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 

我已經嘗試過使用合併和連接,但無法弄清楚如何在多個表上執行以及何時涉及多個關節。有人可以幫我解決這個問題嗎?

感謝

回答

57

合併他們在兩個步驟,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] 
+0

非常感謝您的回答。因爲我有很多數據框,所以我一直在尋找一種將表連接在一起的快捷方式 - 類似於使用「連接」,因爲您可以一步連接兩個以上的表。但是,我不知道如何在多個連接條件下執行此操作。如果沒有更快的方法來做這件事,我會堅持你的建議:) – user3311225

+0

熊貓加入是比關係演算更多的關係代數,你需要按順序指定步驟。 SQL允許您一起指定所有內容,查詢引擎將決定產生結果的最佳步驟。 – ChuckCottrill

0

人們也可以做到這一點與@ TomAugspurger的回答,像這樣的小型版本:

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