Pyspark:根据条件得出多个值

时间:2019-03-18 23:34:23

标签: python 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种不同情况获得计数:

Case1 =处方和诊断患者的计数

Case2 =开处方但未诊断出患者的计数

Case3 =未处方和诊断患者的计数

Case4 =未开处方且未诊断出患者的计数

我知道,如果对诊断做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”

感觉很简单,但是我已经为此花了好一会儿。

执行此操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

Fisrt,您可以尝试编写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

Update1:​​

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

我们可以通过计数 患者总数-prescr_testdrug是计数-prescr_testdrug没有计数=病例2 +病例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]                |             |