[英]How to update a row based on other rows in pandas in an efficient way
我想根據其他行更新熊貓 df 行上的值。
我有一個關於患者的數據框,他們需要獲得的所有疫苗,一列表明他們是否已經接種過疫苗,還有一個“狀態”列,如果他們接種了疫苗,則為“好的”,或者“缺失”如果他們不這樣做。
問題是存在等效的疫苗。 在下面的例子中,疫苗 B 和 C 是等效的。 因此,如果患者接種了 B 疫苗,則不應接種 C 疫苗。 因此,在這種情況下,疫苗 B 的正確狀態為“確定”,疫苗 C 的正確狀態為“已應用等效疫苗”。
數據框超過 200 萬行,所以我需要一種有效的方法來構建“desired_status”列。
任何想法如何做到這一點? 謝謝!
病人 | 疫苗 | 申請了嗎? | 地位 | 期望狀態 |
---|---|---|---|---|
1 | 一種 | 1 | 好的 | 好的 |
1 | 乙 | 1 | 好的 | 好的 |
1 | C | 0 | 丟失的 | 應用等效疫苗 |
2 | 一種 | 0 | 丟失的 | 丟失的 |
2 | 乙 | 0 | 丟失的 | 應用等效疫苗 |
2 | C | 1 | 好的 | 好的 |
3 | 一種 | 1 | 好的 | 好的 |
3 | 乙 | 0 | 丟失的 | 丟失的 |
3 | C | 0 | 丟失的 | 丟失的 |
PS:等效疫苗不一定在相鄰的行中。
您可以使用字典來映射等效項,然后使用groupby
+ agg
和numpy.select
:
eq_vaccines = {'B': 'BC', 'C': 'BC'}
eq = df['vaccine'].map(eq_vaccines).combine_first(df['vaccine'])
applied_any = df.groupby(['patient', eq])['applied?'].transform('max').eq(1)
import numpy as np
df['status'] = np.select([df['applied?'].eq(1), applied_any],
['Ok', 'Applied equivalent vaccine'], 'Missing')
輸出:
patient vaccine applied? status
0 1 A 1 Ok
1 1 B 1 Ok
2 1 C 0 Applied equivalent vaccine
3 2 A 0 Missing
4 2 B 0 Applied equivalent vaccine
5 2 C 1 Ok
6 3 A 1 Ok
7 3 B 0 Missing
8 3 C 0 Missing
patient vaccine applied? status eq applied_any
0 1 A 1 Ok A 1
1 1 B 1 Ok BC 1
2 1 C 0 Applied equivalent vaccine BC 1
3 2 A 0 Missing A 0
4 2 B 0 Applied equivalent vaccine BC 1
5 2 C 1 Ok BC 1
6 3 A 1 Ok A 1
7 3 B 0 Missing BC 0
8 3 C 0 Missing BC 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.