web-dev-qa-db-fra.com

Comment trouver efficacement le nombre de valeurs Null et Nan pour chaque colonne dans un cadre de données PySpark?

import numpy as np

df = spark.createDataFrame(
    [(1, 1, None), (1, 2, float(5)), (1, 3, np.nan), (1, 4, None), (1, 5, float(10)), (1, 6, float('nan')), (1, 6, float('nan'))],
    ('session', "timestamp1", "id2"))

résultat attend

dataframe avec le nombre de nan/null pour chaque colonne

Remarque: Les questions précédentes que j'ai trouvées dans le débordement de pile ne vérifient que null et non nan. C'est pourquoi j'ai créé une nouvelle question.

Je sais que je peux utiliser la fonction isnull () dans spark pour trouver le nombre de valeurs Null dans Spark colonne mais comment trouver les valeurs de Nan dans Spark dataframe?

24
GeorgeOfTheRF

Vous pouvez utiliser la méthode montrée ici et remplacer isNull par isnan:

from pyspark.sql.functions import isnan, when, count, col

df.select([count(when(isnan(c), c)).alias(c) for c in df.columns]).show()
+-------+----------+---+
|session|timestamp1|id2|
+-------+----------+---+
|      0|         0|  3|
+-------+----------+---+

ou

df.select([count(when(isnan(c) | col(c).isNull(), c)).alias(c) for c in df.columns]).show()
+-------+----------+---+
|session|timestamp1|id2|
+-------+----------+---+
|      0|         0|  5|
+-------+----------+---+
69
user8183279

Vous pouvez créer un UDF pour vérifier la cabine null et NaN et renvoyer la valeur boolean à filtrer.

Le code est scala code espérons que vous pourrez convertir en python.

val isNaN = udf((value : Float) => {
   if (value.equals(Float.NaN) || value == null) true else false }) 

val result = data.filter(isNaN(data("column2"))).count()

J'espère que cela t'aides !

1
Shankar Koirala