python - 如何以有效的方式基于 pandas 中的其他行更新行

标签 python pandas

我想根据其他行更新 pandas df 行的值。

我有一个包含患者的数据框、他们需要接种的所有疫苗、一个指示他们是否已经接种疫苗的列,以及一个“状态”列,如果他们接种了疫苗,则为“Ok”,或者如果他们不这样做,则为“失踪”。

问题是有等效的疫苗。在下面的示例中,疫苗 B 和 C 是等效的。因此,如果患者接种了B疫苗,则不应接种C疫苗。因此,本例中B疫苗的正确状态为“Ok”,C疫苗为“已应用等效疫苗”。

数据框超过 200 万行,因此我需要一种有效的方法来构建“desired_status”列。

任何想法如何做到这一点?谢谢!

<表类="s-表"> <头> 患者 疫苗 应用了吗? 状态 desired_status <正文> 1 A 1 确定 确定 1 B 1 确定 确定 1 C 0 缺失 应用等效疫苗 2 A 0 缺失 缺失 2 B 0 缺失 应用等效疫苗 2 C 1 确定 确定 3 A 1 确定 确定 3 B 0 缺失 缺失 3 C 0 缺失 缺失

PS:等效疫苗不一定在相邻行。

最佳答案

您可以使用字典来映射等价物,然后使用groupby+aggnumpy.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/

相关文章:

python - 指数曲线拟合不适合

python - Pandas 分组计数和比例

python - 使用python比较两个数组中的元素并在一个值大于另一个值时返回True

python - 跨行执行聚合函数(例如平均值)会产生 NaN

python - 使用字典数据将数据附加到 Pandas 数据框

python - 如何在 Pandas 中组合和形成复杂的数据框

python - 如何提高随机森林多类分类模型的准确率?

python - 尝试从列表中删除一组元组时遇到问题?

python - 如何根据列名删除列python pandas

python - 我是否需要迁移以将数据库链接到 Django