pyspark数据帧中按行计算空数

tor*_*ond 3 dataframe apache-spark-sql pyspark pyspark-sql

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

请注意,有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'|
+---+-----+-----+-----+
Run Code Online (Sandbox Code Playgroud)

运行代码后,所需的输出为:

+---+-----+-----+-----+--------+
| id|item1|item2|item3|numNulls|
+---+-----+-----+-----+--------+
|  1|    2|  'A'| null|       1|
|  2| null|    1| null|       2|
|  3| null|    9|  'C'|       1|
+---+-----+-----+-----+--------+
Run Code Online (Sandbox Code Playgroud)

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

Psi*_*dom 6

转换null10然后将其他转换为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|
+---+-----+-----+-----+--------+
Run Code Online (Sandbox Code Playgroud)

  • 所以我使用 [pyspark.sql.functions.sum](http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.sum) 而不是 Python [ sum](https://docs.python.org/2/library/functions.html#sum) 这给我带来了问题。有关差异的更多信息[此处](/sf/ask/3338343081/ Correct-way-to-sum- Different-dataframe-columns-in-a-list-in-pyspark) (3认同)