逐行计算pyspark数据帧中的空值数

Posted

技术标签:

【中文标题】逐行计算pyspark数据帧中的空值数【英文标题】:Counting number of nulls in pyspark dataframe by row 【发布时间】:2018-10-17 22:56:52 【问题描述】:

所以我想逐行计算数据帧中空值的数量。

请注意,有 50 多列,我知道我可以使用 case/when 语句来执行此操作,但我更喜欢更简洁的解决方案。

例如,一个子集:

columns = ['id', 'item1', 'item2', 'item3']
vals = [(1, 2, 0, None),(2, None, 1, None),(3,None,9, 1)]
df=spark.createDataFrame(vals,columns)
df.show()

+---+-----+-----+-----+
| id|item1|item2|item3|
+---+-----+-----+-----+
|  1|    2|  'A'| null|
|  2| null|    1| null|
|  3| null|    9|  'C'|
+---+-----+-----+-----+

运行代码后,想要的输出是:

+---+-----+-----+-----+--------+
| id|item1|item2|item3|numNulls|
+---+-----+-----+-----+--------+
|  1|    2|  'A'| null|       1|
|  2| null|    1| null|       2|
|  3| null|    9|  'C'|       1|
+---+-----+-----+-----+--------+

编辑:并非所有非空值都是整数。

【问题讨论】:

【参考方案1】:

null 转换为1 和其他转换为0 然后sum 所有列:

df.withColumn('numNulls', sum(df[col].isNull().cast('int') for col in df.columns)).show()
+---+-----+-----+-----+--------+
| id|item1|item2|item3|numNulls|
+---+-----+-----+-----+--------+
|  1|    2|    0| null|       1|
|  2| null|    1| null|       2|
|  3| null|    9|    1|       1|
+---+-----+-----+-----+--------+

【讨论】:

这些值实际上并不总是整数,我已经更新了问题以反映这一点。 答案不假定整数。它通常检查 null,如果为 null,则将值替换为 1,否则为 0。然后求和。 完美运行。谢谢。 我在同一个例子中得到错误TypeError: 'Column' object is not callable 所以我使用 pyspark.sql.functions.sum 而不是 Python sum 这给我带来了问题。更多关于区别here

以上是关于逐行计算pyspark数据帧中的空值数的主要内容,如果未能解决你的问题,请参考以下文章

从 Pyspark 中的数据框中计算空值和非空值

Pyspark:如何处理 python 用户定义函数中的空值

如何在pyspark数据帧中过滤空值?

pyspark 数据框立方体方法返回重复的空值

Pyspark 计数非空值之间的空值

如何在 PySpark 中用该列的第一个非空值填充该列的空值