2
votes

Fusion de pandas DataFrames sans changer les noms de colonne d'origine

Je veux combiner 2 dataframes avec certaines conditions. Je pense que j'ai besoin de fonctionnalités agrégées de pd.merge et pd.concat, j'ai lu tous les exemples ici mais je n'ai toujours pas trouvé d'informations pour résoudre mon problème.

gauche:

    key1  key2  valueX  valueY  valueX  valueY
     A    a1     1       4       7       10
     B    b1     2       5      nan      nan
     B    b2    nan     nan      8       11
     C    c1     3       6       9       12

droite:

key1  key2  valueX  valueY
 A    a1     7       10
 B    b2     8       11
 C    c1     9       12

Je veux les combiner donc c'est

  • fusionné sur 2 clés sur axe = 1
  • jointure externe
  • ne modifiez pas les noms ValueX, valueY, ajoutez simplement de nouvelles colonnes à droite avec les mêmes noms de colonnes

comme ci-dessous:

key1  key2  valueX  valueY
 A    a1     1       4
 B    b1     2       5
 C    c1     3       6


0 commentaires

3 Réponses :


3
votes

Vous ne savez pas pourquoi vous voulez des colonnes en double, mais vous pouvez utiliser concat

Newdf=pd.concat([df1.set_index(['key1',  'key2']),df2.set_index(['key1',  'key2'] )],axis=1).\
        reset_index()
Newdf
Out[711]: 
  key1 key2  valueX  valueY  valueX  valueY
0    A   a1     1.0     4.0     7.0    10.0
1    B   b1     2.0     5.0     NaN     NaN
2    B   b2     NaN     NaN     8.0    11.0
3    C   c1     3.0     6.0     9.0    12.0


1 commentaires

Merci pour l'aide! mais il semble réorganiser mes clés alors j'ai accepté une autre réponse, mais merci pour l'inspiration, je ne savais pas que je pouvais définir plusieurs index avant ... Merci!



4
votes

Effectuez une FULL OUTER JOIN avec merge , puis supprimez les suffixes par la suite.

u = left.merge(right, on=['key1', 'key2'], suffixes=('', '__2'), how='outer') 
u.columns = u.columns.str.replace('__2', '')

u
  key1 key2  valueX  valueY  valueX  valueY
0    A   a1     1.0     4.0     7.0    10.0
1    B   b1     2.0     5.0     NaN     NaN
2    C   c1     3.0     6.0     9.0    12.0
3    B   b2     NaN     NaN     8.0    11.0


1 commentaires

Sympa ... simple et direct .... ça résout mon problème! =) Merci !!



2
votes

Vous pouvez fusionner avec l'espace comme suffixe et supprimer plus tard

new_df = df1.merge(df2, on = ['key1', 'key2'], suffixes=(' ', ' '), how = 'outer')
new_df.columns = new_df.columns.str.strip()

    key1    key2    valueX  valueY  valueX  valueY
0   A       a1      1.0     4.0     7.0     10.0
1   B       b1      2.0     5.0     NaN     NaN
2   C       c1      3.0     6.0     9.0     12.0
3   B       b2      NaN     NaN     8.0     11.0


1 commentaires

Merci beaucoup! =)