Skip to main content
 首页 » 编程设计

python之Pyspark之计算每个数据框列中的空值数

2025年05月04日38sharpest

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

例子:

+-------------+-------------+ 
| 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     | 
+------------+ 

有什么想法吗?

请您参考如下方法:

您可以使用列表理解遍历 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| 
#+--------+--------+--------+ 

如果您希望将结果放在一列中,您可以使用 functools.reduce 合并 df_agg 中的每一列,如下所示:

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 
    ) 
)