悠悠楠杉
用Pandas和正则表达式驯服混乱的CSV文件头
正文:
在数据分析师的日常工作中,经常会遇到这样的场景:业务部门发来的CSV文件,文件头像是被随意拼接的乐高积木——同一列可能包含"日期_2023"、"Date(Q2)"等变体,甚至混杂着说明文字。这种非标准化数据往往需要耗费大量手工处理时间。
最近我接手了一个电商促销数据的分析项目,原始数据文件头堪称"灾难现场":
Product ID (Note: required field),Price[USD];2023,库存状态_最新
"销售区域(省/市)","促销周期(days)",备注信息面对这种"行为艺术"般的文件头,传统方法需要编写复杂的预处理脚本。但通过Pandas结合正则表达式,我们可以构建更优雅的解决方案。
首先导入必要的库并观察原始数据:
import re
rawdf = pd.readcsv('promotiondata.csv', header=None, nrows=3) print(rawdf.iloc[0:3, 0:5])
关键步骤是设计正则表达式模板来提取有效字段名。例如处理包含单位说明的字段:
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('_')实际应用中还需要考虑异常情况处理。我们添加了字段验证逻辑:
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. 处理缺失值
