检查数据框是否包含任何空值

时间:2019-05-03 06:15:30

标签: python apache-spark dataframe pyspark

我有一个数据框,需要查看它是否包含空值。关于同一主题的文章很多,但几乎所有文章都使用count操作或show方法。

在我看来,

count操作非常昂贵,因为数据量很大。与show方法相同。

有没有一种方法可以让spark在遇到第一个空值时立即查找空值并引发错误?

其他帖子中的解决方案给出了每列中缺失值的计数。我不需要知道每一列中缺失值的数量。 我只想知道数据框中是否有一个值为空的单元格。

3 个答案:

答案 0 :(得分:2)

您可能必须检查所有值并检查空值。这可以通过以列方式或行方式遍历数据帧来完成。哪一个最佳取决于数据(使用启发式)。

行遍历:

import pyspark.sql.functions as f
from functools import reduce

df.where(reduce(lambda x, y: x | y, (f.col(x).isNull() for x in df.columns))).limit(1).collect().isEmpty

逐列遍历(根据经验,此应该更快,请参见Clock Slave的评论)

import pyspark.sql.functions as f

contains_nulls = False
for c in df.columns:
  if not df.where(f.col(c).isNull()).limit(1).collect().isEmpty:
    contains_nulls = True
    break

limit(1)用于在找到第一个空值时停止,并collect().isEmpty用于检查数据帧是否为空。

答案 1 :(得分:1)

您可以为此使用limit

df.select("*").where(col("c").isNull()).limit(1)

答案 2 :(得分:0)

据我了解,您的要求是,如果任何列为空,则只举标志。您不需要知道所有实际的行都为空。

解决方案: 我可以想到的最简单的方法是为您的DataFrame创建一个tempView并尽可能地检查是否为null。这是该代码的伪代码-

YourDF.createOrReplaceTempView("tempView")
tempViewDF = sqlContext.sql("SELECT count(*) FROM tempView WHERE Col1 is null or Col2 is null or col3 is null")

flag=flase

if tempViewDF > 0:
  flag=true

现在根据需要使用标志。

关于, 阿努帕姆