基于多条件与未知项的Python大规模数据集提取清洗问题
处理超2亿行脏数据的Python实现方案
核心解决思路
- 用
str.extract替代str.match:前者在无匹配时会返回NaN,不会导致操作中断,关键是写对精准的正则表达式 - 超大规模数据必须分块处理,避免一次性加载耗尽内存
正则表达式设计
针对你的三个需求,对应的正则如下:
- ID列:匹配3字母+数字的格式,正则:
^([A-Za-z]{3}\d+)$ - CODE列:提取前后可能带SS的4字母代码,正则:
(?:SS)?([A-Za-z]{4})(?:SS)?(非捕获组匹配SS,只捕获中间4字母) - DESCRIPTION列:提取指定前缀+5-8位数字,正则:
(XX|XY|XZ|YZ)\d{5,8}
分块处理代码示例
import pandas as pd # 定义各字段的正则规则 regex_rules = { 'ID': r'^([A-Za-z]{3}\d+)$', 'CODE': r'(?:SS)?([A-Za-z]{4})(?:SS)?', 'EXTRACT': r'(XX|XY|XZ|YZ)\d{5,8}' } # 分块大小根据内存配置调整,比如10万行/块 chunk_size = 100000 processed_chunks = [] # 分块读取源数据(以CSV为例,其他格式替换对应read方法) for chunk in pd.read_csv('source_data.csv', chunksize=chunk_size): # 提取ID,无匹配则为NaN chunk['ID'] = chunk['ID'].str.extract(regex_rules['ID'], expand=False) # 提取CODE字段的4字母核心内容 chunk['CODE'] = chunk['CODE'].str.extract(regex_rules['CODE'], expand=False) # 从DESCRIPTION提取目标字符串生成EXTRACT列 chunk['EXTRACT'] = chunk['DESCRIPTION'].str.extract(regex_rules['EXTRACT'], expand=False) # 只保留需要的三列 filtered_chunk = chunk[['ID', 'CODE', 'EXTRACT']] processed_chunks.append(filtered_chunk) # 合并所有分块得到最终DataFrame final_df = pd.concat(processed_chunks, ignore_index=True) # 保存结果 final_df.to_csv('cleaned_result.csv', index=False)
额外优化建议
- 如果内存仍紧张,可进一步缩小分块大小,或使用
dtype参数指定各列的数据类型(比如ID设为字符串类型,避免自动推断占用更多内存) - 若源数据是Parquet等列式存储格式,优先用
pd.read_parquet,读取效率更高 - 若某列大量无匹配值,可提前用
dropna过滤,但建议先完成提取再处理空值,避免遗漏有效数据
内容的提问来源于stack exchange,提问作者annaf
相关产品推荐
相关产品推荐

