4. 数据清洗与预处理:去除首尾空格、统一日期格式、处理特殊字符、数据类型强制转换
数据清洗,说白了就是给数据「洗澡」。
你从客户、供应商或者老系统里拿到的 CSV,十有八九是「脏」的。我见过最夸张的一次,一个配方表里居然混了三种日期格式,还有一列数字里藏着肉眼看不见的换行符。嗯,今天我们就来把这几个坑填平。
核心原则:清洗不是炫技,是保命。数据不干净,后面所有分析都是垃圾。
4.1 去除首尾空格——最容易被忽略的隐形杀手
空格这东西,你看不见,但程序认。比如「A001 」和「A001」在 Excel 里长得一样,但在 Python 里就是两个不同的字符串。我早期做配方导入时,就因为一个尾空格,导致物料编码匹配不上,整整排查了两小时。
怎么处理?我个人习惯用 strip() 方法,一行代码搞定所有列:
import pandas as pd
df = pd.read_csv('配方数据.csv')
# 去除所有字符串列的首尾空格
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)
小技巧:如果你只想处理特定列,可以用
df['列名'] = df['列名'].str.strip()。别一股脑全洗,有时候空格是有意义的。
4.2 统一日期格式——让时间回到同一个频道
日期格式混乱,是 CSV 导入的「老演员」了。有的写 2024/01/15,有的写 01-15-2024,还有写 2024年1月15日的。你想想看,如果不对齐,排序、筛选、计算全都会乱套。
我建议统一转为 YYYY-MM-DD 标准格式,这是数据库和大多数系统都认的「普通话」:
# 强制转换日期列
df['生产日期'] = pd.to_datetime(df['生产日期'], errors='coerce')
# 格式化为标准字符串
df['生产日期'] = df['生产日期'].dt.strftime('%Y-%m-%d')
注意:
errors='coerce' 会把无法解析的日期变成 NaT(空值)。我曾经因为这个参数,漏掉了一批手工填写的「2024.1.15」格式数据。建议先检查异常值:df[df['生产日期'].isna()]。
4.3 处理特殊字符——逗号和换行符的「暗箭」
CSV 文件里,逗号是字段分隔符。如果某个字段里本身就含有逗号,比如「添加剂A, 5g」,导入时就会被拆成两列,整个表结构就崩了。
换行符更隐蔽。有些老系统导出的数据,单元格里嵌了 \n,你肉眼看不出来,但程序读到换行就以为新的一行开始了。
我的处理方案分两步:
- 替换逗号:把字段内的逗号换成全角逗号「,」或分号「;」
- 清理换行符:用正则把
\n和\r替换成空格
import re
# 处理特殊字符
def clean_text(text):
if isinstance(text, str):
text = text.replace(',', ',') # 半角逗号转全角
text = re.sub(r'[\n\r]+', ' ', text) # 换行符替换为空格
text = re.sub(r'\s+', ' ', text) # 多个空格合并为一个
return text
df = df.applymap(clean_text)
避坑指南:我曾经处理一批进口配方数据,发现字段里藏了
\t(制表符),导致导入后多出空列。建议用 print(df.iloc[0].to_dict()) 先看一眼原始数据的「真面目」。
4.4 数据类型强制转换——让数字归数字,文本归文本
CSV 读进来后,所有数据默认都是字符串。但配方数据里,浓度、温度、重量这些必须是数值型,否则没法计算。
我常用的转换规则:
| 原始类型 | 目标类型 | 转换方法 | 常见坑 |
|---|---|---|---|
| 数字字符串(如 "25.5") | float | pd.to_numeric() |
混入字母会报错,用 errors='coerce' |
| 整数字符串(如 "100") | int | astype(int) |
先确保无空值,否则转 float 再转 int |
| 日期字符串 | datetime | pd.to_datetime() |
格式不统一时用 dayfirst 参数 |
| 分类数据(如 "A级") | category | astype('category') |
减少内存占用,但排序需指定顺序 |
# 批量强制转换示例
df['浓度'] = pd.to_numeric(df['浓度'], errors='coerce')
df['温度'] = df['温度'].astype(float)
df['批次号'] = df['批次号'].astype(str) # 防止前导零丢失
血的教训:批次号「00123」如果直接转 int 会变成 123,前导零就丢了。我有个同事因为这个,导致一批物料追溯失败。记住:看起来像数字但不参与计算的字段,一律保留为字符串。
4.5 清洗流程总览
上面四个步骤,我建议按这个顺序执行:
这个顺序是我踩过坑之后总结的。比如先转日期再清空格,日期转换时可能因为空格报错;先转类型再清特殊字符,数字里的逗号会被当成千分位符号。嗯,顺序很重要。
一句话总结:清洗四步走——去空格、整日期、清乱码、转类型。每一步都做扎实了,后面的导入和分析才能稳如老狗。