web-dev-qa-db-fra.com

Pandas) jointure externe gauche de plusieurs images sur plusieurs colonnes

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

51
user3311225

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]
78
TomAugspurger

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'])
8
FatihAkici