如何统计PySpark DataFrame各列中仅含特殊字符的行数?
实现方法
可以通过PySpark的正则匹配和聚合函数来实现这个需求,核心是准确定义“仅含特殊字符”的判断逻辑,再对每列统计符合条件的行数。
具体步骤与代码
- 导入必要的函数:
from pyspark.sql.functions import col, count, when
- 定义统计逻辑:
我们需要排除Null值、纯空白单元格(空字符串/全空格)、包含字母/数字的单元格,只统计非空、非纯空白、且所有字符都是非字母数字特殊字符的行。写一个复用的统计函数:
def count_special_only(col_name): return count(when( col(col_name).isNotNull() & ~col(col_name).rlike('^\\s*$') & col(col_name).rlike('^[^a-zA-Z0-9]+$'), 1 )).alias(col_name)
- 对所有列执行统计并转成字典:
# 对DataFrame的每一列应用统计函数 result_df = df.agg(*[count_special_only(col) for col in df.columns]) # 将结果转为字典格式 result_dict = result_df.collect()[0].asDict() print(result_dict)
运行后会输出预期结果:{'ID': 0, 'col_1': 3, 'col_2': 1}
逻辑说明
col(col_name).isNotNull():排除Null值(比如样例中col_1的第5行);~col(col_name).rlike('^\\s*$'):排除纯空白单元格(包括空字符串、全空格,比如样例中col_2的第2、3行);col(col_name).rlike('^[^a-zA-Z0-9]+$'):匹配所有字符都是非字母数字的特殊字符——^和$确保整个字符串都符合规则,[^a-zA-Z0-9]表示不包含字母和数字,+表示至少有一个字符。
如果需要调整特殊字符的范围(比如排除下划线、加号等),只需修改正则表达式中的[^a-zA-Z0-9]部分即可,比如要排除下划线就改成[^a-zA-Z0-9_]。
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

