web-dev-qa-db-ja.com

PySparkデータフレームの各列のNull値とNan値のカウントを効率的に見つける方法は?

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

期待される出力

各列にnan/nullのカウントを持つデータフレーム

注:スタックオーバーフローで見つかった以前の質問は、nullではなくnullのみをチェックします。それが私が新しい質問を作成した理由です。

私はspark列のNull値の数を見つけるためにSparkのisnull()関数を使用できることを知っていますが、SparkデータフレームのNan値を見つける方法は?

24
GeorgeOfTheRF

次のメソッドを使用できます 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|
+-------+----------+---+
69
user8183279

UDFを作成して、nullNaNの両方を確認し、booleanの値を返してフィルタリングできます。

コードはscalaコードです。Pythonに変換できることを願っています。

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

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

お役に立てれば !

1
Shankar Koirala