7 votes

Comment fusionner/joindre un dataframe vide avec un autre dataframe rempli par des indices et des noms de colonnes égaux ?

Je veux combiner deux dataframes . Un dataframe Disons que Empty_DF est vide et a une grande taille (320 colonnes par 240 lignes) avec des index et des noms de colonnes uniquement des entiers. L'autre, ROI_DF est plus petit et rempli et correspond à un certain endroit aux index et aux noms de colonnes.

J'ai essayé d'utiliser le pandas.merge comme il a été suggéré dans ce question Cependant, il ajoutera simplement les colonnes à la liste vide de l'annuaire. dataframe Empty_DF et ne pas remplacer les valeurs.

Empty_DF = pd.DataFrame({'a':[0,0,0,0,0,0],
            'b':[0,0,0,0,0,0], 'b':[0,0,0,0,0,0]}, index=list('abcdef'))

print (Empty_DF)

 ROI_DF= pd.DataFrame({'a':range(4),
            'b':[5,6,7,8]}, index=list('abce'))

 print(ROI_DF)
   a  b  c
a  0  0  0
b  0  0  0
c  0  0  0
d  0  0  0
e  0  0  0
f  0  0  0

Dans cet exemple, il suffit que le dataframe est faible et le pandas.fillna avec pandas.drop peut être utilisée. Existe-t-il un moyen plus efficace d'optimiser ce processus pour obtenir des résultats plus importants ? dataframes ?

df3 = pd.merge(Empty_DF, ROI_DF, how='left', left_index=True, 
right_index=True, suffixes=('_x', ''))
df3['a'].fillna(df3['a_x'], inplace=True)
df3['b'].fillna(df3['b_x'], inplace=True)
df3.drop(['a_x', 'b_x'], axis=1, inplace=True)

print(df3)
 a  b c
a  0  5 0
b  1  6 0
c  2  7 0
d  0  0 0
e  3  8 0
f  0  0 0

3voto

Erfan Points 19682

C'est un cas parfait pour DataFrame.update qui s'aligne sur les indices

Empty_DF.update(ROI_DF)

Salida

print(df3)

     a    b  c
a  0.0  5.0  0
b  1.0  6.0  0
c  2.0  7.0  0
d  0.0  0.0  0
e  3.0  8.0  0
f  0.0  0.0  0

Notez que update est en place, comme indiqué dans la documentation :

Modifier en place en utilisant des valeurs non-NA d'un autre DataFrame.

Cela signifie que votre cadre de données original sera mis à jour par les nouvelles valeurs. Pour éviter cela, utilisez :

df3 = Empty_DF.copy()
df3.update(ROI_DF)

2voto

Quang Hoang Points 191

Vous pouvez soit utiliser update :

Empty_DF.update(ROI_DF)

sortie :

     a    b  c
a  0.0  5.0  0
b  1.0  6.0  0
c  2.0  7.0  0
d  0.0  0.0  0
e  3.0  8.0  0
f  0.0  0.0  0

Ou loc :

Empty_DF.loc[ROI_DF.index, ROI_DF.columns] = ROI_DF

sortie :

   a  b  c
a  0  5  0
b  1  6  0
c  2  7  0
d  0  0  0
e  3  8  0
f  0  0  0

1voto

W-B Points 94428

Dans votre cas reindex_like

yourdf=ROI_DF.reindex_like(Empty_DF).fillna(0)
     a    b    c
a  0.0  5.0  0.0
b  1.0  6.0  0.0
c  2.0  7.0  0.0
d  0.0  0.0  0.0
e  3.0  8.0  0.0
f  0.0  0.0  0.0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X