Сравните элементы двух столбцов фрейма данных pandas и создайте новый столбец на основе третьего столбца. - PullRequest
0 голосов
/ 14 марта 2019

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

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   |

Я бы хотел сравнить идентификаторы лиц в обоих этих кадрах данных и вставить соответствующее значение Infected в 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, и он занимает слишком много времени и не очень читабелен. Есть ли эффективный способ сделать это? Спасибо!

Ответы [ 2 ]

1 голос
/ 14 марта 2019

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

df1['Infected'] = df1['PersonID'].map(df2.set_index('PersonID')['Infected']).fillna(False)
0 голосов
/ 14 марта 2019

Другой подход заключается в использовании 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...