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

預計輸出如何有效地找到Pyspark數據框中每列的空值和南值的計數?

數據框與南計數/空爲每列

注: 我在堆棧溢出只爲空&不囡檢查中發現的以前的問題。 這就是爲什麼我創建了一個新的問題。

我知道我可以在spark中使用isnull()函數來查找Spark列中的空值的數量,但是如何在Spark數據框中找到Nan值?

+0

是否需要爲每個列單獨計算nan/Null值(因此每列需要兩列),還是隻想知道列中有多少元素不能被視爲數字? – titiro89

+0

南/空值分開計數將工作 –

回答

13

可以使用方法中所示here和替換isNullisnan

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| 
+-------+----------+---+ 

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

這工作!爲什麼col(c).isnan()給出錯誤而col(c).isNull()工作正常?請解釋。 –

+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/pyspark.sql.html?highlight=isnan#pyspark.sql.functions.isnan)。這兩個鏈接將幫助你。 「isnan()」是pysparq.sql.function包的函數,因此您必須設置要用作該函數參數的列。 「isNull()」屬於pyspark.sql.Column包,所以你需要做的是「yourColumn.isNull()」 – titiro89

2

可以創建一個UDF到ckeck既nullNaN並返回boolean值來過濾

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

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

希望這會有所幫助!

相關問題