用Pandas和正则表达式驯服混乱的CSV文件头

2026年01月03日/ 浏览 16

正文:

在数据分析师的日常工作中,经常会遇到这样的场景:业务部门发来的CSV文件,文件头像是被随意拼接的乐高积木——同一列可能包含”日期_2023″、”Date(Q2)”等变体,甚至混杂着说明文字。这种非标准化数据往往需要耗费大量手工处理时间。

最近我接手了一个电商促销数据的分析项目,原始数据文件头堪称”灾难现场”:

Product ID (Note: required field),Price[USD];2023,库存状态_最新
"销售区域(省/市)","促销周期(days)",备注信息

面对这种”行为艺术”般的文件头,传统方法需要编写复杂的预处理脚本。但通过Pandas结合正则表达式,我们可以构建更优雅的解决方案。

首先导入必要的库并观察原始数据:

import pandas as pd
import re

rawdf = pd.readcsv('promotiondata.csv', header=None, nrows=3) print(rawdf.iloc[0:3, 0:5])

关键步骤是设计正则表达式模板来提取有效字段名。例如处理包含单位说明的字段:

def cleanheader(header):
    # 提取中英文核心字段名
    pattern = r'([\u4e00-\u9fa5]+)|([a-zA-Z]\w*)'
    matches = re.findall(pattern, header)
    return ''.join([m[0] or m[1] for m in matches if any(m)])

headers = [cleanheader(str(col)) for col in rawdf.iloc[0]] cleandf = pd.readcsv('promotiondata.csv', header=1) cleandf.columns = headers

这个方案成功将混乱的原始文件头转换为标准格式:
1. “Price[USD];2023” → “PriceUSD”
2. “库存状态
最新” → “库存状态”
3. “促销周期(days)” → “促销周期”

对于更复杂的情况,比如包含多层说明的字段,可以采用分步处理策略:

def parsenestedheader(header):
    # 先移除注释内容
    header = re.sub(r'([^)]*)', '', header)
    # 再处理特殊字符
    return re.sub(r'[^\w\u4e00-\u9fa5]', '_', header).strip('_')

实际应用中还需要考虑异常情况处理。我们添加了字段验证逻辑:

validheaders = ['productid', 'price', 'region']
cleaned_headers = []

for h in headers: hlower = h.lower() for vh in validheaders: if vh in hlower: cleanedheaders.append(vh) break else: cleanedheaders.append('unknown' + str(len(cleaned_headers)))

这种方法的优势在于:
– 保持代码可读性的同时处理复杂模式
– 通过正则表达式组捕获实现灵活匹配
– 保留中文字段的处理能力
– 对数据源的适应性更强

在完成文件头解析后,后续的数据清洗工作变得水到渠成。我们可以轻松地:
1. 标准化日期格式
2. 统一货币单位
3. 处理缺失值

picture loss