簡體   English   中英

比較兩個熊貓數據框列的元素,並基於第三列創建一個新列

[英]Compare elements of two pandas data frame columns and create a new column based on a third column

我有兩個數據框:

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   |

我想比較這兩個數據框中的人員ID,如果不匹配人員ID,則將相應的Infected值插入df1和False中。 理想情況下,輸出如下所示:

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循環編碼,它花費的時間太長,而且可讀性不強。 有一種有效的方法可以做到這一點嗎? 謝謝!

一種方法是為df1['PersonID'].map()提供一個Series,該Series的索引為PersonID並且值被Infected

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

另一種方法是使用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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM