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

Databricks中PySpark如何将DataFrame的'?'字符串转换为NULL

可行实现方案

之前方案失效的核心原因:你操作的是PySpark分布式DataFrame,和numpy、pandas的单机DataFrame API完全不通用,第三套方案的问题是regexp_replace中?是正则特殊字符需要转义、替换目标为字符串'NA'而非PySpark原生NULL、且没有将修改后的新DataFrame赋值给变量保存,所以没有生效。

最优方案:使用PySpark原生na.replace方法

这是最简单的官方原生实现,支持全表或指定列批量替换,性能最优:

# 1. 全表所有列将'?'替换为NULL
d = d.na.replace('?', None)

# 2. 如果仅需要替换指定列,新增subset参数指定目标列即可
# target_cols = ['workclass', 'occupation', 'native-country']
# d = d.na.replace('?', None, subset=target_cols)

# 替换完成后直接调用dropna删除含空值的行
d = d.dropna(subset=target_cols)

备选方案:when函数自定义逻辑实现

如果需要额外加判断逻辑,可以用when函数逐列处理,支持批量遍历所有字符串列:

from pyspark.sql.functions import when, col
from pyspark.sql.types import StringType

# 批量遍历所有字符串类型的列,替换'?'为NULL
for col_name in d.columns:
    if isinstance(d.schema[col_name].dataType, StringType):
        d = d.withColumn(col_name, when(col(col_name) == '?', None).otherwise(col(col_name)))

# 后续删除空值逻辑同上
d = d.dropna()

注意事项

  • PySpark DataFrame是不可变对象,所有修改操作都会返回新的DataFrame,必须赋值给变量才能保存修改结果
  • 不建议将分布式PySpark DataFrame转为pandas DataFrame处理,数据量超过Driver节点内存时会直接触发OOM,优先用PySpark原生分布式API

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 21:36:06