7
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")) 

Erwartete AusgabeWie kann man die Null- und Nan-Werte für jede Spalte in einem Pyspark-Dataframe effizient ermitteln?

Datenrahmen mit der Zählung der nan/null für jede Spalte

Hinweis: Die vorherigen Fragen, die ich in Stack-Überlauf prüft nur für null gefunden & nicht nan. Deshalb habe ich eine neue Frage erstellt.

Ich weiß, ich kann Isnull() -Funktion in Spark verwenden, um die Anzahl der Null-Werte in der Spark-Spalte zu finden, aber wie Nan-Werte in Spark Datenrahmen zu finden?

+0

Möchten Sie eine separate Anzahl von Nan/Null-Wert für jede Spalte (also zwei Spalten für jede Spalte) oder möchten Sie nur wissen, wie viele Elemente Ihrer Spalten nicht als eine Zahl betrachtet werden können? – titiro89

+0

separate count of nan/Null Wert wird funktionieren –

Antwort

13

können Sie Methode verwenden here gezeigt und ersetzen isNull mit 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| 
+-------+----------+---+ 

oder

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

Das hat funktioniert! Warum gibt col (c) .isnan() Fehler während col (c) .isNull() funktioniert gut? Bitte erkläre. –

+1

[isNull] (http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html?highlight=isnull#pyspark.sql.Column.isNull) vs [Isnan] (http: //spark.apache.org/docs/2.1.0/api/python/pypark.sql.html?highlight=isnan#pypark.sql.functions.isnan). Diese zwei Links werden dir helfen. "isnan()" ist eine Funktion des Pakets pysparq.sql.function. Sie müssen also festlegen, welche Spalte als Argument der Funktion verwendet werden soll. "isNull()" gehört zum Paket "pyspark.sql.Column". Sie müssen also "yourColumn.isNull()" eingeben. – titiro89

2

Sie können eine UDF schaffen sowohl ckeck null und NaN und gibt den boolean Wert

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

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

Hoffe, das hilft!

Verwandte Themen