J'ai deux dataframes df1 et df2
id city 0 4735 x 1 46 b 2 2345 d 3 8768 e 4 807 f
df1 ressemble à
XXX
et df2 ressemble à:
id city_in_mail 0 4735 x
Je veux remplacer la valeur de la colonne city dans dataframe df1 à partir de la valeur de la colonne city_in_mail de dataframe df2 pour la ligne où la valeur id est le même.
Donc mon df1 devrait devenir:
id city 0 4735 a 1 46 b 2 2345 d 3 8768 e 4 807 f
Comment faire ça avec les pandas?
4 Réponses :
Utilisez les index pour faire correspondre, puis loc
city id 4735 x 46 b 2345 d 8768 e 807 f
Ou utilisez update
c = df1.city c.update(df2.city_in_mail) df1['city'] = c
Toutes les sorties
df1 = df1.set_index('id')
df2 = df2.set_index('id')
df1.loc[df1.index.isin(df2.index), :] = df2.city_in_mail
Utilisation de merge avec .loc
s=df1.merge(df2,how='outer') s.loc[s.city_in_mail.notnull(),'city']=s.city_in_mail s city id city_in_mail 0 x 4735 x 1 b 46 NaN 2 d 2345 NaN 3 e 8768 NaN 4 f 807 NaN
Essayez combine_first avec rename pour aligner l'index de la colonne:
id city 0 4735.0 x 1 46.0 b 2 2345.0 d 3 8768.0 e 4 807.0 f
Sortie:
df2.set_index('id')\
.rename(columns={'city_in_mail':'city'})\
.combine_first(df1.set_index('id'))\
.reset_index()
@pygo Merci.
cette solution échoue si la ligne avec l'ID correspondant dans df1 n'est pas la première ligne
Ah ... oui, vous pouvez définir l'index sur ID. J'ai supposé que l'ID était l'index. Ma faute.
Aussi .map + .fillna (si 'id' est une clé unique dans df2 ) < pré> XXX