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

pandas读取CSV时如何灵活匹配任意长度空格作为na_value

问题解答

pandas.read_csv()的na_values参数仅支持精确值匹配,不支持正则表达式,传入'\s*'只会匹配字面量为\s*的字符串,无法实现任意长度空白的空值识别,硬编码固定长度空格的方案天然无法适配动态填充的对齐空格场景。

可行解决方案

以下两种方案都可以完美适配任意长度空白填充的空值场景,按需选择即可:

方案1:读取阶段用converters做字段清洗(改动最小)

不需要调整你现有读文件的核心逻辑,只需要新增converters参数,在字段解析阶段自动清除前后空白、把纯空白内容转为NaN,后续dtype转换会自动完成,不会触发类型转换错误:

import numpy as np
import pandas as pd

def clean_whitespace_field(field_str):
    stripped_val = field_str.strip()
    return np.nan if stripped_val == "" else stripped_val

data = pd.read_csv(
    fn,
    header=0,
    usecols=<目标列列表>,
    converters={col: clean_whitespace_field for col in <目标列列表>},
    dtype=<目标类型字典>,
    na_values=[],
    decimal=".",
    skip_blank_lines=True,
    keep_default_na=False,
    names=<目标列名列表>
)

这个方案的优势是读取和清洗同步完成,不需要额外的后处理步骤,和你现有代码的兼容度最高。

方案2:读入后统一做类型转换(通用性最强)

如果不同批次文件的脏数据规则差异较大,可以先按默认配置读入文件,再统一做全表清洗,最后转成目标类型,容错性更高:

import numpy as np
import pandas as pd

# 第一步:先读入原始数据,不提前指定dtype
data = pd.read_csv(
    fn,
    header=0,
    usecols=<目标列列表>,
    decimal=".",
    skip_blank_lines=True,
    names=<目标列名列表>
)

# 第二步:清洗所有文本列的前后空白,纯空白内容转空值
data = data.apply(
    lambda col: col.str.strip().replace("", np.nan) if col.dtype == "object" else col
)

# 第三步:统一转换为目标数据类型
data = data.astype(<目标类型字典>)

这个方案除了能处理空格填充的空值,还能顺带解决字段前后带多余空格、不可见空白字符(比如制表符、全角空格)的问题,适合多来源非规范数据的处理场景。

注意事项

  • 不需要尝试通过扩充na_values列表覆盖所有可能的空格长度,电力公司导出时的对齐空格长度是随字段内容动态变化的,永远无法穷举。
  • 如果仅数值列存在空白填充问题,也可以只给数值列配置清洗逻辑,日期、编码类文本列如果不需要转数值,可以跳过清洗减少性能消耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:06:19