Pyspark-计算每个数据框列中的空值数量

LEJ*_*LEJ 1 python python-3.x apache-spark-sql pyspark pyspark-sql

我有一个包含许多列的数据框。我的目标是产生一个列出每个列名称的数据框,以及该列中空值的数量。

例:

+-------------+-------------+
| Column_Name | NULL_Values |
+-------------+-------------+
|  Column_1   |      15     |
|  Column_2   |      56     |
|  Column_3   |      18     |
|     ...     |     ...     |
+-------------+-------------+
Run Code Online (Sandbox Code Playgroud)

我设法获得一个列的空值数量,如下所示:

df.agg(F.count(F.when(F.isnull(c), c)).alias('NULL_Count'))
Run Code Online (Sandbox Code Playgroud)

其中c是在数据帧的一列。但是,它不显示列的名称。输出为:

+------------+
| NULL_Count |
+------------+
|     15     |
+------------+
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

pau*_*ult 5

您可以使用列表推导式遍历中的所有列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])
Run Code Online (Sandbox Code Playgroud)

但是,这将在一行中返回结果,如下所示:

df_agg.show()
#+--------+--------+--------+
#|Column_1|Column_2|Column_3|
#+--------+--------+--------+
#|      15|      56|      18|
#+--------+--------+--------+
Run Code Online (Sandbox Code Playgroud)

如果你想在一列的结果相反,你可以从工会每列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|
#+-----------+----------+
Run Code Online (Sandbox Code Playgroud)

或者,您可以跳过创建的中间步骤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
    )
)
Run Code Online (Sandbox Code Playgroud)