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