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

如何统计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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:25:17