У меня есть два фрейма данных df1 и df2.
s = {'id': [4735,46,2345,8768,807],'city': ['a', 'b', 'd', 'e', 'f']}
s1 = {'id': [4735],'city_in_mail': ['x']}
df1 = pd.DataFrame(s)
df2 = pd.DataFrame(s1)
df1 выглядит так
id city
0 4735 a
1 46 b
2 2345 d
3 8768 e
4 807 f
и df2 выглядит так:
id city_in_mail
0 4735 x
Я хочу заменить значение столбца city в фрейме данных df1 значением столбца city_in_mail из кадра данных df2 для строки, где значение id такое же.
Итак, мой df1 должен стать:
id city
0 4735 x
1 46 b
2 2345 d
3 8768 e
4 807 f
Как это сделать с пандами?






Используйте индексы для сопоставления, а затем loc
df1 = df1.set_index('id')
df2 = df2.set_index('id')
df1.loc[df1.index.isin(df2.index), :] = df2.city_in_mail
c = df1.city
c.update(df2.city_in_mail)
df1['city'] = c
Все выходы
city
id
4735 x
46 b
2345 d
8768 e
807 f
Конечно, не стесняйтесь делать df1.reset_index() в конце, чтобы вернуться к предыдущей структуре.
Использование merge с .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
Попробуйте combine_first с rename для выравнивания индекса столбца:
df2.set_index('id')\
.rename(columns = {'city_in_mail':'city'})\
.combine_first(df1.set_index('id'))\
.reset_index()
Вывод:
id city
0 4735.0 x
1 46.0 b
2 2345.0 d
3 8768.0 e
4 807.0 f
Примечание. При желании вы можете переназначить это обратно на df1.
это решение не работает, если строка с совпадающим идентификатором в df1 не является первой строкой
Ах... да, вы можете установить индекс на ID. Я предположил, что ID был индексом. Виноват.
Также .map + .fillna (если 'id' является уникальным ключом в df2)
df1['city'] = df1.id.map(df2.set_index('id').city_in_mail).fillna(df1.city)
print(df1)
# id city
#0 4735 x
#1 46 b
#2 2345 d
#3 8768 e
#4 807 f
@pygo Спасибо.