我有一个包含一些列的数据框,在进行分析之前,我想了解一下数据框有多完整。因此,我希望过滤 Dataframe 并为每一列计算非空值的数量,可能会返回一个 Dataframe 。
基本上,我正在尝试实现与this question相同的结果,但使用的是Scala而不是Python。
假设您拥有:
val row = Row("x", "y", "z")
val df = sc.parallelize(Seq(row(0, 4, 3), row(None, 3, 4), row(None, None, 5))).toDF()
如何为每列汇总非空值的数量,并返回列数相同且只返回一行结果的 Dataframe 呢?
6条答案
按热度按时间mrwjdhj31#
一种直接的选择是使用
.describe()
函数来获取 Dataframe 的摘要,其中计数行包括非空值的计数:i5desfxk2#
尽管我喜欢Psidom Answer,但我通常对空值的分数更感兴趣,因为仅仅是非空值的数量并不能说明太多问题……
您可以执行以下操作:
编辑:
sum(when($"x".isNotNull,0).otherwise(1))
也可以替换为count($"x")
,count($"x")
只计算非空值。因为我发现这并不明显,所以我倾向于使用sum
表示法,它更清楚r6l8ljro3#
以下是我在Scala 2.11,Spark 2.3.1中如何做到这一点:
count(*)
计算非空行,count(1)
在每一行上运行。如果您想要计算人口中的百分比空,请找到我们基于计数的公式的补码:
同样值得知道的是,您可以将空值转换为整数,然后对其求和。
但它的表现可能不那么出色:
wmvff8tz4#
下面是最简单的查询:
mbyulnm05#
或
3pvhb19x6#
Spark 2.3+
(适用于字符串和数字类型列)