J'ai un dataframe comme ci-dessous:
dataframe.groupBy(col("id_doctor"))
.agg(
countDistinct(col("id_patient")).where(col("type_drug") == "bhd" & col("consumption") < 16.0)
)
Je veux compter des patients distincts qui prennent Bhd avec une consommation
J'ai essayé la requête suivante mais cela ne fonctionne pas:
+-----------+------------+-------------+-----------+ | 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 | +-----------+------------+-------------+-----------+
une aide?
merci!
3 Réponses :
Utilisez simplement le where sur votre dataframe - cette version supprime le id_doctor où le compte est 0:
dataframe.withColumn(
"fg",
F.when(
(col("type_drug") == "bhd")
& (col("consumption") < 16.0),
col("id_patient")
)
).groupBy(
col("id_doctor")
).agg(
countDistinct(col("fg"))
)
En utilisant cette syntaxe, vous pouvez conserver tous les " médecins ":
dataframe.where(
col("type_drug") == "bhd" & col("consumption") < 16.0
).groupBy(
col("id_doctor")
).agg(
countDistinct(col("id_patient"))
)
Et solution sans ajouter de colonne supplémentaire (Scala)
dataframe
.groupBy("id_doctor")
.agg(
countDistinct(when(col("type_drug")==="bhd" && col("consumption") < 16.0))
)
Une autre solution dans PySpark sans ajouter une autre colonne:
dataframe.groupBy('id_doctor').agg(F.countDistinct(F.when(col("type_drug") == "bhd" & col("consumption") < 16.0, col('id_doctor')).otherwise(None)))
Voulez-vous une réponse SQL ou pyspark?
salut @jarlh je veux une requête pyspark car c'est un grand ensemble de données
@hakim Pourriez-vous s'il vous plaît partager l'exemple qui peut être rapidement utilisé pour construire la base de données. Partagez également l'exemple de sortie que vous recherchez.