web-dev-qa-db-fra.com

Fusionner deux python pandas trames de données de longueur différente mais garder toutes les lignes dans la trame de données de sortie)

J'ai le problème suivant: J'ai deux pandas trames de données de longueur différente contenant des lignes et des colonnes qui ont des valeurs communes et d'autres qui sont différentes, comme ceci:

df1:                                 df2:

      Column1  Column2  Column3           ColumnA  ColumnB ColumnC
    0    a        x        x            0    c        y       y
    1    c        x        x            1    e        z       z
    2    e        x        x            2    a        s       s
    3    d        x        x            3    d        f       f
    4    h        x        x
    5    k        x        x            

Ce que je veux faire maintenant, c'est fusionner les deux dataframes de sorte que si ColumnA et Column1 ont la même valeur, les lignes de df2 sont ajoutées à la ligne correspondante dans df1, comme ceci:

df1:
    Column1  Column2  Column3  ColumnB  ColumnC
  0    a        x        x        s        s
  1    c        x        x        y        y
  2    e        x        x        z        z
  3    d        x        x        f        f
  4    h        x        x        NaN      NaN
  5    k        x        x        NaN      NaN

Je sais que la fusion est réalisable

df1.merge(df2,left_on='Column1', right_on='ColumnA')

mais cette commande supprime toutes les lignes qui ne sont pas les mêmes dans Column1 et ColumnA dans les deux fichiers. Au lieu de cela, je veux conserver ces lignes dans df1 et leur affecter simplement NaN dans les colonnes où d'autres lignes ont une valeur de df2, comme indiqué ci-dessus. Existe-t-il un moyen simple de le faire chez les pandas?

Merci d'avance!

25
sequence_hard

Vous pouvez lire la documentation ici: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html

Ce que vous recherchez est une jointure gauche. L'option par défaut est une jointure interne. Vous pouvez modifier ce comportement en passant un argument how différent:

df1.merge(df2,how='left', left_on='Column1', right_on='ColumnA')
27
Sina

On dirait que vous cherchez quelque chose comme une jointure gauche. Voyez si cet exemple aide: http://pandas.pydata.org/pandas-docs/stable/comparison_with_sql.html#left-outer-join

Vous pouvez essentiellement passer un paramètre à merge() appelé how='left'

6
sgrg

Vous pouvez aussi simplement utiliser la fusion avec l'utilisation de on et list

result = df1.merge(df2, on=['Column1'])

Pour plus d'informations, suivez lien

4
Nirali Khoda