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
相关产品推荐
相关产品推荐

