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

Databricks中PySpark正则替换特殊字符、删除列报错求解

问题场景
  • 读取分隔符为|的CSV文件生成DataFrame,原始读取代码如下:
dt = pd.read_csv(StringIO(response.text), delimiter="|", encoding='utf-8-sig')
  • 读取后发现列名存在特殊字符,同时需要删除第一列
  • 自行编写的正则替换代码运行触发语法错误,错误代码如下:
dt.withColumn('COUNTRY ID', regexp_replace('COUNTRY ID', @"[^0-9a-zA-Z_]+"_ ""))
错误原因
  • API混用:withColumn、regexp_replace是PySpark DataFrame的内置方法,Pandas库没有对应接口,在Pandas对象上直接调用会抛出属性错误
  • 语法错误:Python正则表达式不需要添加@前缀,正则参数分隔格式不符合Python语法要求,会触发语法解析错误
  • 乱码根源:是UTF-8 BOM头被错误解析后的产物,说明源文件编码和读取时指定的编码匹配存在偏差
解决方法

根据你实际使用的库选择对应方案即可:

方案1:Pandas环境实现

优先在读取阶段处理异常,减少后续清洗逻辑:

import pandas as pd
from io import StringIO

# 读取时自动过滤空值第一列,指定编码处理BOM头
dt = pd.read_csv(
    StringIO(response.text),
    delimiter="|",
    encoding='utf-8-sig',
    usecols=lambda col: not col.startswith('Unnamed')
)

# 批量清理所有列名中的乱码字符,仅保留数字、字母、下划线、空格
dt.columns = dt.columns.str.replace(r'[^0-9a-zA-Z_\s]+', '', regex=True)

如果读取后仍残留开头的异常列名,可以补充以下处理逻辑:

# 移除列名中的乱码前缀
dt.columns = [col.replace('', '') for col in dt.columns]
# 删除第一列
dt = dt.iloc[:, 1:]

方案2:PySpark环境实现

修正API调用和正则写法即可:

from pyspark.sql.functions import regexp_replace

dt = dt.withColumnRenamed('COUNTRY ID', 'COUNTRY ID') \
       .withColumn('COUNTRY ID', regexp_replace('COUNTRY ID', r'[^0-9a-zA-Z_]+', '')) \
       .drop(dt.columns[0])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:42:58