Панды оставили внешнее соединение нескольких кадров данных на нескольких столбцах

Я новичок в использовании 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 не подключен к году):

 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, но не могу понять, как это сделать на нескольких таблицах и когда задействовано несколько соединений. Может ли кто-нибудь помочь мне в этом, пожалуйста?

благодаря

Объедините их в два этапа: df1 и df2 , а затем результат от 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] 

Можно также сделать это с помощью компактной версии ответа @ TomAugspurger, например:

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