我想根据其他行更新 pandas df 行的值。
我有一个包含患者的数据框、他们需要接种的所有疫苗、一个指示他们是否已经接种疫苗的列,以及一个“状态”列,如果他们接种了疫苗,则为“Ok”,或者如果他们不这样做,则为“失踪”。
问题是有等效的疫苗。在下面的示例中,疫苗 B 和 C 是等效的。因此,如果患者接种了B疫苗,则不应接种C疫苗。因此,本例中B疫苗的正确状态为“Ok”,C疫苗为“已应用等效疫苗”。
数据框超过 200 万行,因此我需要一种有效的方法来构建“desired_status”列。
任何想法如何做到这一点?谢谢!
PS:等效疫苗不一定在相邻行。
最佳答案
您可以使用字典来映射等价物,然后使用groupby
+agg
和numpy.select
:
eq_vaccines = {'B': 'BC', 'C': 'BC'}
vac = df['vaccine'].map(eq_vaccines).combine_first(df['vaccine'])
applied_any = df.groupby(['patient', vac])['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 vac 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
关于python - 如何以有效的方式基于 pandas 中的其他行更新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69989894/