You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:20:27