скопировать столбец из другого фрейма данных на основе совпадающих значений

#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