Сравните элементы двух столбцов фрейма данных pandas и создайте новый столбец на основе третьего столбца

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня есть два фрейма данных:

 df1:

| ID | PersonID | Sex |
|:--:|:--------:|:---:|
|  1 |    123   |  M  |
|  2 |    124   |  F  |
|  3 |    125   |  F  |
|  4 |    126   |  F  |
|  5 |    127   |  M  |
|  6 |    128   |  M  |
|  7 |    129   |  F  |

df2:
| ID | PersonID | Infected |
|:--:|:--------:|:--------:|
|  1 |    125   |   True   |
|  2 |    124   |   False  |
|  3 |    126   |   False  |
|  4 |    128   |   True   |

  

Я хотел бы сравнить идентификаторы пользователей в обоих этих фреймах данных и вставить соответствующее зараженное значение в df1 и False, если PersonID не соответствует. В идеале результат должен выглядеть следующим образом:

 df1:
| ID | PersonID | Sex | Infected |
|:--:|:--------:|:---:|:--------:|
|  1 |    123   |  M  |   False  |
|  2 |    124   |  F  |   False  |
|  3 |    125   |  F  |   True   |
|  4 |    126   |  F  |   False  |
|  5 |    127   |  M  |   False  |
|  6 |    128   |  M  |   True   |
|  7 |    129   |  F  |   False  |

  

У меня закодирован цикл for, и это занимает слишком много времени и не очень читаемо. Есть ли эффективный способ сделать это? Спасибо!

Комментарии:

1. Значение Infected столбца person 124 находится False в df2 , но True в сопоставленном наборе данных. Это ошибка или основано на определенной логике?

2. Это была ошибка. Исправлено!

Ответ №1:

Один из подходов заключается в предоставлении df1['PersonID'].map() ряда, индекс которого PersonID и значения Infected :

 df1['Infected'] = df1['PersonID'].map(df2.set_index('PersonID')['Infected']).fillna(False)
  

Комментарии:

1. @RushilZutshi, приятно слышать!

Ответ №2:

Другой подход заключается в использовании pd.merge

 df1 = pd.merge(df1, df2[['PersonID', 'Infected']], on=['PersonID'], how='left').fillna(False)
  

Или

 df1 = df1.merge(df2[['PersonID', 'Infected']], on=['PersonID'], how='left').fillna(False)