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

如何列出PySpark DataFrame中所有值均为Null或'0'的列

错误原因

你之前仅用isNull()方法实现逻辑存在两个核心问题:

  • 判定条件不全:仅校验了值是否为Null,没有覆盖值为0的匹配场景
  • 缺少整列聚合校验逻辑:没有判断「列内所有值都满足要求」,只要列内存在任意非Null、非0的值,该列就不符合筛选规则,因此会把存在'M'、'F'值的Col3,存在'TW18'值的Col5错误纳入结果。
正确实现方案

核心判定逻辑:对每一列统计既不是Null、也不等于0的记录数,如果该计数为0,说明整列值全为Null或0,符合筛选要求。

基础易懂写法

逻辑直白好理解,适合小数据量场景:

from pyspark.sql import functions as F

# 替换为你的DataFrame变量名
df = # 你的源DataFrame
result_cols = []

for col_name in df.columns:
    # 筛选当前列中 非Null且非0 的异常行
    abnormal_row_count = df.filter(
        ~(F.col(col_name).isNull() | (F.col(col_name) == 0))
    ).count()
    # 无异常行则说明该列符合要求
    if abnormal_row_count == 0:
        result_cols.append(col_name)

# 最终输出 ['Col2', 'Col4']
print(result_cols)

高性能写法

仅触发一次Spark计算任务,适合大数据量场景,避免逐列count带来的性能损耗:

from pyspark.sql import functions as F

# 一次聚合计算所有列的异常值数量
agg_expressions = [
    F.sum(
        (~(F.col(col).isNull() | (F.col(col) == 0))).cast("int")
    ).alias(col)
    for col in df.columns
]
agg_res = df.agg(*agg_expressions).collect()[0]

# 筛选异常值总数为0的列
result_cols = [col for col in df.columns if agg_res[col] == 0]
逻辑说明
  • F.col(col_name).isNull() | (F.col(col_name) == 0) 用于匹配列中值为Null或者0的合法行
  • 前面加~取反,即可筛选出所有不符合规则的异常行
  • 异常行计数为0时,证明整列没有非0、非Null的异常值,就是需要找的目标列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 05:01:02