Pyspark - вычисляет количество нулевых значений в каждом столбце данных. - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть датафрейм со многими столбцами.Моя цель - создать фрейм данных, в котором будет указано имя каждого столбца, а также количество пустых значений в этом столбце.

Пример:

+-------------+-------------+
| Column_Name | NULL_Values |
+-------------+-------------+
|  Column_1   |      15     |
|  Column_2   |      56     |
|  Column_3   |      18     |
|     ...     |     ...     |
+-------------+-------------+

Мне удалось получить число пустых значений.значения для ОДНОГО столбца, например, так:

df.agg(F.count(F.when(F.isnull(c), c)).alias('NULL_Count'))

, где c - это столбец в кадре данных.Тем не менее, он не показывает имя столбца.Вывод:

+------------+
| NULL_Count |
+------------+
|     15     |
+------------+

Есть идеи?

1 Ответ

0 голосов
/ 12 сентября 2018

Вы можете использовать понимание списка, чтобы перебрать все ваши столбцы в agg, и использовать alias, чтобы переименовать выходной столбец:

import pyspark.sql.functions as F

df_agg = df.agg(*[F.count(F.when(F.isnull(c), c)).alias(c) for c in df.columns])

Однако это вернет результаты водна строка, как показано ниже:

df_agg.show()
#+--------+--------+--------+
#|Column_1|Column_2|Column_3|
#+--------+--------+--------+
#|      15|      56|      18|
#+--------+--------+--------+

Если вы хотите получить результаты в одном столбце, вы можете объединить каждый столбец из df_agg, используя functools.reduce следующим образом:

from functools import reduce
df_agg_col = reduce(
    lambda a, b: a.union(b),
    (
        df_agg.select(F.lit(c).alias("Column_Name"), F.col(c).alias("NULL_Count")) 
        for c in df_agg.columns
    )
)
df_agg_col.show()
#+-----------+----------+
#|Column_Name|NULL_Count|
#+-----------+----------+
#|   Column_1|        15|
#|   Column_2|        56|
#|   Column_3|        18|
#+-----------+----------+

Или вы можете пропустить промежуточный этап создания df_agg и выполнить:

df_agg_col = reduce(
    lambda a, b: a.union(b),
    (
        df.agg(
            F.count(F.when(F.isnull(c), c)).alias('NULL_Count')
        ).select(F.lit(c).alias("Column_Name"), "NULL_Count")
        for c in df.columns
    )
)
...