如何统计Spark DataFrame各列中字符串型变体None值的数量?
如何用PySpark统计多种格式的"None"字符串数量?
我有一个大型数据集,部分列为String数据类型。由于拼写错误,部分单元格存在多种格式的None字符串值(含大小写差异、带/不带空格、带/不带括号等)。我需要统计所有列中这类值的数量(排除真正的Null值)。
示例数据集
data = [("A", "None", 1), \ ("A", "(None)", 2), \ ("[None", "none", 3), \ ("(none]", "[None]", 4), \ ("A", "(none)", 5), \ ("A", "(none", 6), \ ("A", "none ", 7), \ (" NOne ", None, None), \ ] # 创建DataFrame columns= ["col_1", "col_2", "Number"] df = spark.createDataFrame(data = data, schema = columns)
期望结果
{'col_1': 3, 'col_2': 7, 'Number': 0}
解决方案
可以通过正则匹配结合PySpark内置函数实现,核心思路是用正则覆盖所有变种的"None"字符串,再逐列统计符合条件的行数:
实现代码
from pyspark.sql import functions as F # 定义匹配所有None变种的正则:允许前后空格/括号,忽略大小写 none_pattern = r'^\s*[\(\[\{]?none[\)\]\}]?\s*$' # 遍历所有列,统计符合条件的数量(排除真正的Null值) none_count_result = { col: df.filter(F.col(col).isNotNull()) .select(F.sum(F.when(F.col(col).rlike(none_pattern), 1).otherwise(0)).alias('count')) .collect()[0]['count'] for col in df.columns } print(none_count_result)
代码说明
F.col(col).isNotNull():先过滤掉列中真正的Null值,避免误统计F.col(col).rlike(none_pattern):用正则匹配判断单元格是否属于变种"None"字符串,rlike默认支持忽略大小写匹配F.when(..., 1).otherwise(0):匹配成功标记为1,否则为0,求和后得到该列的目标值总数
运行代码后输出结果将与期望完全一致。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

