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 种不同情况获得计数:
病例 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”
感觉很简单,但我一直在努力解决这个问题。
这样做的最佳方法是什么?
解决方案
首先,您可以尝试编写一个 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] | |
推荐阅读
- redirect - 如何在未经许可的情况下将 IE 重定向到 youtube、twitter、stackoverflow 等 Edge
- reactjs - 尝试使用react threejs上传gltf文件时无法读取属性'lastIndexOf'的空错误
- slurm - Slurmd 无法启动并出现以下错误:致命:无法确定此 slurmd 的 NodeName
- spring-boot - 如何在部署时动态设置vue js中的env属性作为springboot应用程序
- database - 在 PL/SQL 中检查全局定义的 Varray 或嵌套表的结构
- javascript - 如何根据 Angular 的 *ngIf 条件更改 css?
- javascript - 无法使用 Jquery 从小屏幕上的 div 中删除类
- python - 获取python字符串中相同字符的第一个连续序列的开始和结束索引
- build - Azure DevOps - 通过 VSBuild@1 启用 .pdb 文件生成
- python - Tensorflow model.predict() 为图像输入数组中的最后几张图像生成 NaN