簡體   English   中英

如何以有效的方式根據 Pandas 中的其他行更新一行

[英]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 + aggnumpy.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.

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