Подсчет количества нулей в кадре данных pyspark по строкам

Итак, я хочу посчитать количество нулей в кадре данных по строкам.

Обратите внимание, что существует более 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|
+---+-----+-----+-----+--------+

РЕДАКТИРОВАТЬ: не все ненулевые значения являются целыми.


person tormond    schedule 17.10.2018    source источник


Ответы (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|
+---+-----+-----+-----+--------+
person Psidom    schedule 17.10.2018
comment
На самом деле значения не всегда являются целыми числами, я обновил вопрос, чтобы отразить это. - person tormond; 18.10.2018
comment
Ответ не предполагает целых чисел. Обычно он проверяет null, и если он равен нулю, заменяет значение на 1, в противном случае 0. И затем подсчитывает сумму. - person Psidom; 18.10.2018
comment
Прекрасно работает. Спасибо. - person tormond; 18.10.2018
comment
Я получаю ошибку TypeError: 'Column' object is not callable для того же примера - person Ali; 11.04.2019
comment
Итак, я использовал pyspark. sql.functions.sum вместо суммы Python, вызвал для меня проблему. Подробнее о разнице здесь - person Ali; 11.04.2019