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

PySpark遍历DataFrame列表统计Null/NaN值的实现方案

PySpark遍历DataFrame列表统计Null/NaN值方案

核心思路

先定义一个函数处理单个DataFrame的缺失值统计,明确区分Isnan(仅数值列的NaN)和Null(所有列的空值,包含NaN),再遍历DataFrame列表批量处理,最终输出结构化的统计结果。

完整代码实现

from pyspark.sql import SparkSession
from pyspark.sql.functions import col, isnan, when, sum

# 初始化SparkSession(若未初始化)
spark = SparkSession.builder.appName("NullNaNCount").getOrCreate()

def count_null_nan(df, df_name):
    # 统计所有列的Null数量(包含NaN)
    null_counts = df.agg(*[sum(when(col(c).isNull(), 1).otherwise(0)).alias(f"{c}_null") for c in df.columns])
    # 仅统计数值列的Isnan数量
    numeric_types = ["double", "float", "integer", "long"]
    isnan_counts = df.agg(*[sum(when(isnan(col(c)), 1).otherwise(0)).alias(f"{c}_isnan") 
                            for c in df.columns if df.schema[c].dataType.simpleString() in numeric_types])
    
    # 转换为结构化格式:DF名称、列名、统计类型、数量
    null_rows = []
    for c in df.columns:
        null_val = null_counts.collect()[0][f"{c}_null"]
        null_rows.append((df_name, c, "Null", null_val))
    
    isnan_rows = []
    for c in df.columns:
        if df.schema[c].dataType.simpleString() in numeric_types:
            isnan_val = isnan_counts.collect()[0][f"{c}_isnan"]
            isnan_rows.append((df_name, c, "Isnan", isnan_val))
    
    # 合并结果转为DataFrame
    result_df = spark.createDataFrame(null_rows + isnan_rows, ["DF_Name", "Column_Name", "Count_type", "Count"])
    return result_df

# 示例:创建测试DataFrame列表
df1 = spark.createDataFrame([(1, None, float('nan')), (None, 2, 3.0)], ["col1", "col2", "col3"])
df2 = spark.createDataFrame([(float('nan'), "test", None), (4, None, 5.5)], ["col_a", "col_b", "col_c"])
df_list = [("DF1", df1), ("DF2", df2)]

# 遍历列表批量统计
final_results = []
for df_name, df in df_list:
    final_results.append(count_null_nan(df, df_name))

# 合并所有结果并展示
combined_result = final_results[0]
for res in final_results[1:]:
    combined_result = combined_result.union(res)

combined_result.show(truncate=False)

代码说明

  1. count_null_nan函数:
    • 用isNull()捕获所有类型的空值(包含数值列的NaN),用isnan()仅识别数值列的NaN
    • 将零散的列统计结果转换为统一的结构化格式,方便按Count_type分类查看
  2. 遍历处理:
    • 给每个DataFrame指定名称(或用索引),明确区分不同DF的统计数据
    • 合并所有DF的结果,实现批量统计后的统一展示
  3. 输出格式:
    最终结果以DF_Name、Column_Name、Count_type、Count四列呈现,清晰展示每个列的Null和Isnan数量

扩展优化

  • 若需整个DataFrame的汇总统计,只需修改函数逻辑,将各列的统计值求和即可
  • 可将结果保存为CSV/Parquet文件:combined_result.write.mode("overwrite").csv("/指定保存路径")

内容的提问来源于stack exchange,提问作者Lobbel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 02:27:19