我有一个如下数据框:
+-----------+------------+-------------+-----------+
| id_doctor | id_patient | consumption | type_drug |
+-----------+------------+-------------+-----------+
| d1 | p1 | 12.0 | bhd |
| d1 | p2 | 10.0 | lsd |
| d1 | p1 | 6.0 | bhd |
| d1 | p1 | 14.0 | carboxyl |
| d2 | p1 | 12.0 | bhd |
| d2 | p1 | 13.0 | bhd |
| d2 | p2 | 12.0 | lsd |
| d2 | p1 | 6.0 | bhd |
| d2 | p2 | 12.0 | bhd |
+-----------+------------+-------------+-----------+
我想计算每位医生的bhd摄入量<16.0的不同患者。
我尝试了以下查询,但不起作用:
dataframe.groupBy(col("id_doctor"))
.agg(
countDistinct(col("id_patient")).where(col("type_drug") == "bhd" & col("consumption") < 16.0)
)
有什么帮助吗?
谢谢!
答案 0 :(得分:2)
PySpark中的另一种解决方案,无需添加另一列:
return payload
答案 1 :(得分:1)
解决方案,而无需添加其他列(Scala)
dataframe
.groupBy("id_doctor")
.agg(
countDistinct(when(col("type_drug")==="bhd" && col("consumption") < 16.0))
)
答案 2 :(得分:0)
只需在数据帧上使用where
-此版本删除计数为0的id_doctor:
dataframe.where(
col("type_drug") == "bhd" & col("consumption") < 16.0
).groupBy(
col("id_doctor")
).agg(
countDistinct(col("id_patient"))
)
使用此语法,您可以保留所有“医生”:
dataframe.withColumn(
"fg",
F.when(
(col("type_drug") == "bhd")
& (col("consumption") < 16.0),
col("id_patient")
)
).groupBy(
col("id_doctor")
).agg(
countDistinct(col("fg"))
)