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)
代码说明
count_null_nan函数:- 用
isNull()捕获所有类型的空值(包含数值列的NaN),用isnan()仅识别数值列的NaN - 将零散的列统计结果转换为统一的结构化格式,方便按
Count_type分类查看
- 用
- 遍历处理:
- 给每个DataFrame指定名称(或用索引),明确区分不同DF的统计数据
- 合并所有DF的结果,实现批量统计后的统一展示
- 输出格式:
最终结果以DF_Name、Column_Name、Count_type、Count四列呈现,清晰展示每个列的Null和Isnan数量
扩展优化
- 若需整个DataFrame的汇总统计,只需修改函数逻辑,将各列的统计值求和即可
- 可将结果保存为CSV/Parquet文件:
combined_result.write.mode("overwrite").csv("/指定保存路径")
内容的提问来源于stack exchange,提问作者Lobbel
相关产品推荐
相关产品推荐

