pyspark 带条件的非重复值计数

siv3szwd  于 2024-01-06  发布在  Spark
关注(0)|答案(3)|浏览(240)

我有一个框架如下:

  1. +-----------+------------+-------------+-----------+
  2. | id_doctor | id_patient | consumption | type_drug |
  3. +-----------+------------+-------------+-----------+
  4. | d1 | p1 | 12.0 | bhd |
  5. | d1 | p2 | 10.0 | lsd |
  6. | d1 | p1 | 6.0 | bhd |
  7. | d1 | p1 | 14.0 | carboxyl |
  8. | d2 | p1 | 12.0 | bhd |
  9. | d2 | p1 | 13.0 | bhd |
  10. | d2 | p2 | 12.0 | lsd |
  11. | d2 | p1 | 6.0 | bhd |
  12. | d2 | p2 | 12.0 | bhd |
  13. +-----------+------------+-------------+-----------+

字符串
我想计算每位医生服用bhd的消耗量< 16.0的不同患者。
我尝试了下面的query2,但它不工作:

  1. dataframe.groupBy(col("id_doctor")).agg(
  2. countDistinct(col("id_patient")).where(
  3. col("type_drug") == "bhd" & col("consumption") < 16.0
  4. )
  5. )

rsaldnfx

rsaldnfx1#

PySpark中的另一种解决方案,无需添加另一列:

  1. dataframe.groupBy("id_doctor").agg(
  2. F.countDistinct(
  3. F.when(
  4. col("type_drug") == "bhd" & col("consumption") < 16.0, col("id_patient")
  5. ).otherwise(None)
  6. )
  7. )

字符串

5ssjco0h

5ssjco0h2#

只需在您的框架上使用where-此版本删除计数为0的id_doctor:

  1. dataframe.where(
  2. col("type_drug") == "bhd" & col("consumption") < 16.0
  3. ).groupBy(
  4. col("id_doctor")
  5. ).agg(
  6. countDistinct(col("id_patient"))
  7. )

字符串
使用这个语法,你可以保留所有的“医生”:

  1. dataframe.withColumn(
  2. "fg",
  3. F.when(
  4. (col("type_drug") == "bhd")
  5. & (col("consumption") < 16.0),
  6. col("id_patient")
  7. )
  8. ).groupBy(
  9. col("id_doctor")
  10. ).agg(
  11. countDistinct(col("fg"))
  12. )

展开查看全部
1bqhqjot

1bqhqjot3#

不添加额外列的解决方案(Scala)

  1. dataframe
  2. .groupBy("id_doctor")
  3. .agg(
  4. countDistinct(when(col("type_drug")==="bhd" && col("consumption") < 16.0))
  5. )

字符串

相关问题