在PySpark中计算每行含缺失值的列数及占比
Spark 动态计算每行缺失值数量与占比(列数不固定场景)
需求说明
给定包含id列、其余列数不固定的Spark DataFrame,计算每行中非id列的缺失值数量(命名为miss_nb)及占比(命名为miss_pt,保留两位小数),最终仅保留id、miss_nb、miss_pt三列。
实现代码
from pyspark.sql import SparkSession from pyspark.sql.functions import col, when, sum as spark_sum, round # 初始化SparkSession(若未全局初始化) spark = SparkSession.builder.appName("MissingValueCalc").getOrCreate() # 测试数据集 columns = ['id', 'dogs', 'cats'] values = [(1, 2, 0),(2, None, None),(3, None,9)] df = spark.createDataFrame(values, columns) # 1. 动态获取需检查缺失值的列(排除id) check_cols = [col_name for col_name in df.columns if col_name != 'id'] total_check_cols = len(check_cols) # 2. 计算每行缺失值数量:空值转1、非空转0后求和 miss_nb_expr = spark_sum(when(col(c).isNull(), 1).otherwise(0)).alias("miss_nb") # 3. 计算缺失值占比:缺失数/总检查列数,保留两位小数 miss_pt_expr = round(miss_nb_expr / total_check_cols, 2).alias("miss_pt") # 4. 生成结果DataFrame result_df = df.select("id", miss_nb_expr, miss_pt_expr) # 展示结果 result_df.show()
运行结果
+----+-------+-------+ | id|miss_nb|miss_pt| +----+-------+-------+ | 1| 0| 0.00| | 2| 2| 0.67| | 3| 1| 0.33| +----+-------+-------+
关键说明
- 动态适配列数:通过
df.columns自动获取所有列,排除id后无需硬编码列名,兼容任意列数场景。 - 缺失值量化:用
when函数将空值转换为1、非空转换为0,求和后直接得到每行缺失值数量。 - 占比格式化:通过
round函数保留两位小数,确保结果格式符合需求。
内容的提问来源于stack exchange,提问作者Andrii
相关产品推荐
相关产品推荐

