L'utilisation de DataFrame est nouvelle pour moi et j'aimerais savoir comment effectuer l'équivalent SQL d'une jointure externe gauche sur plusieurs colonnes d'une série de tables
Exemple:
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
En gros, je veux faire quelque chose comme ce code SQL (notez que df3 n'est pas joint sur 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
Le résultat devrait ressembler à:
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
J'ai essayé d'utiliser les méthodes de fusion et de jointure, mais je ne vois pas comment le faire sur plusieurs tables et dans les cas où plusieurs liaisons sont impliquées. Quelqu'un pourrait-il m'aider à ce sujet s'il vous plaît?
Merci
Fusionnez-les en deux étapes, df1
et df2
_ d'abord, puis le résultat de cela à df3
.
In [33]: s1 = pd.merge(df1, df2, how='left', on=['Year', 'Week', 'Colour'])
J'ai abandonné l'année de df3 car vous n'en avez pas besoin pour la dernière jointure.
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]
On peut aussi le faire avec une version compacte de la réponse de @ TomAugspurger, comme ceci:
df = df1.merge(df2, how='left', on=['Year', 'Week', 'Colour']).merge(df3[['Week', 'Colour', 'Val3']], how='left', on=['Week', 'Colour'])