首页 > 解决方案 > Pyspark:根据多个值的条件进行计数

问题描述

几天来,我一直在为这个逻辑而苦苦挣扎。假设我有一个看起来像这样的数据框。我只是做了一些虚拟数据,所以它可能没有多大意义:

+----+---------------+------------+
|Id  |prescr_testdrug|diagnosis   |
+---------+----------+------------+
|0   |Yes            |[a,b,c]     |
|1   |Yes            |[b,c]       |
|2   |No             |[b,c,d]     |
|3   |Yes            |[a]         |
|4   |No             |[c,d]       |
|5   |No             |[d,e]       |
|6   |No             |[a,f]       |
|7   |Yes            |[c]         |
|8   |Yes            |[a,d,e]     |
|9   |Yes            |[a]         |
+----+---------------+------------+

我想根据每种不同诊断的 4 种不同情况获得计数:

病例 1 = 开处方和诊断患者的计数

病例 2 = 开处方但未诊断患者的计数

病例 3 = 未开处方和未诊断患者的计数

案例 4 = 未开处方且未诊断患者的计数

我知道,如果我groupBy('diagnosis','prescr_testdrug').count()在进行explode()诊断后这样做,我基本上可以得到 Case1 和 Case 3 的计数(每个诊断的 Yes 和 No 的频率)。但是,我无法理解如何获取其他两种情况的值。

这基本上就是我希望我的最终数据框看起来像的样子:

+---------+------+------+------+------+
|diagnosis|Case1 |Case2 |Case3 |Case4 |
+---------+------+------+------+------+
|a        |     4|     2|     1|     3|
|b        |     2|     4|     1|     3|
|c        |     3|     3|     2|     2|
|d        |     1|     5|     2|     2|
|e        |     1|     5|     1|     3|
|f        |     0|     6|     1|     3|
+---------+------+------+------+------+

例如,对于第一行,有 4 名患者服用了药物并且诊断为“a”;2 名患者也服用了该药并且没有诊断为“a”;1 名患者未开具该药并且诊断为“a”;3 名患者未开具药物处方且未诊断为“a”

感觉很简单,但我一直在努力解决这个问题。

这样做的最佳方法是什么?

标签: pythonpyspark

解决方案


首先,您可以尝试编写一个 UDF 来生成非诊断集

ICD10 代码总数 - 诊断 = 非诊断

+----+---------------+------------+-------------+
|Id  |prescr_testdrug|diagnosis   |not diagnosis|
+---------+----------+------------+-------------+
|0   |Yes            |[a,b,c]     |[d,e]        |
|1   |Yes            |[b,c]       |[a,d,e]      |
|2   |No             |[b,c,d]     |.            |
|3   |Yes            |[a]         |.            |
|4   |No             |[c,d]       |.            |
|5   |No             |[d,e]       |.            |
|6   |No             |[a,f]       |.            |
|7   |Yes            |[c]         |.            | 
|8   |Yes            |[a,d,e]     |.            |
|9   |Yes            |[a]         |.            |
+----+---------------+------------+-------------+

explode() 通过诊断可以得到案例 1 和案例 3 explode() 通过不诊断可以得到案例 2 和案例 4

更新1:

当您通过诊断进行暴露和分组时,您可以得到以下表格,但我不知道如何区分 case2 和 case4。

我们可以按 患者总数计算 - prescr_testdrug 是 count - prescr_testdrug 否 count = case2 + case 4

+----------+-------------------+-------------------+-------------+
|diagnosis |prescr_testdrug Yes| prescr_testdrug No| case2/case4 |
+----------+-------------------+-------------------+-------------+
|a         |[0,3,8,9]          |[6]                |             |
|b         |[0,1]              |[2]                |             |
|c         |[0,1,7]            |[2,4]              |             |
|d         |[8]                |[4]                |             |

推荐阅读