#python-3.x #pandas #dataframe #where-clause
#python-3.x #pandas #фрейм данных #where-предложение
Вопрос:
У меня есть два фрейма данных, один с кодами iso и названиями стран, а другой — только с названиями стран.
Я хотел бы добавить новый столбец в df2
с названиями стран из, df1
если значения df1.iso == df2.id
совпадают.
df1
Country iso
Afghanistan AFG
Afghanistan AFG
Afghanistan AFG
...
и df2
id
AFG
AFG
AFG
AFG
...
Я пробовал это:
post['country'] = pre['Country'].where(pre['iso'] == post['id'])
Но я получил ошибку
ValueError: Can only compare identically-labeled Series objects
Комментарии:
1. Вы хотите добавить сопоставление значений с df1 или df2?
2. Я хочу, чтобы в df2 был столбец ‘Country’, где, если столбец ‘id’ в df2 совпадает со столбцом ‘iso’ в df1, тогда значение столбца ‘Country’ в этой записи в df1 копируется в соответствующую строку в df2. Таким образом, все ‘AFG’ в df2 должны иметь во вновь добавленном столбце ‘Страна’ ‘Афганистан’… и так далее для всех строк (которые содержат коды ISO всех стран мира).
Ответ №1:
Вы можете использовать DataFrame.merge
слияние с df2
влево df1
после удаления повторяющихся значений из df1
:
df2 = df2.merge(df1.drop_duplicates(), left_on='id',
right_on='iso', how='left').drop('iso', 1)
Или вы можете использовать Series.map
для сопоставления Country
от df1
до df2
на iso
основе, на,, основе кода:
df2['Country'] = df2['id'].map(df1.drop_duplicates().set_index('iso')['Country'])
Результат:
print(df2)
id Country
0 AFG Afghanistan
1 AFG Afghanistan
2 AFG Afghanistan
3 AFG Afghanistan