2
votes

Remplacement d'une valeur dans une colonne dans pandas dataframe à partir d'une valeur de colonne dans une autre dataframe

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?


0 commentaires

4 Réponses :


3
votes

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


0 commentaires

3
votes

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


0 commentaires

3
votes

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()


3 commentaires

@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.



3
votes

Aussi .map + .fillna (si 'id' est une clé unique dans df2 ) < pré> XXX


0 commentaires