引言
数据清洗作为数据分析流程的基石环节,其过程往往伴随着各种隐性问题。即使是经验丰富的开发者,在使用 Python 进行数据清洗时,也常会遭遇诸如填充策略失效、格式转换异常等棘手状况。本文基于工业级数据处理经验,系统梳理数据清洗过程中的典型问题,深入剖析底层原因,并提供可直接落地的解决方案与代码实现。
数据读取阶段的编码与解析问题
1. 编码识别失效问题
症状表现:使用pd.read_csv()读取文件时,即使指定encoding='utf-8'仍出现UnicodeDecodeError,或文本中出现 "éâæ" 等乱码字符。
技术成因:
- 文件实际采用混合编码(如部分字段使用 GBK,主体为 UTF-8)
- 存在非标准 UTF-8 字节序列(如 Windows 系统生成的 BOM 头)
- 文本经过多次编码转换导致的 "mojibake" 现象
解决方案:
import chardet
import pandas as pd
# 1. 精确检测文件编码
with open('messy_data.csv', 'rb') as f:
raw_data = f.read(10000) # 读取前10KB用于检测
encoding_result = chardet.detect(raw_data)
confidence = encoding_result['confidence']
encoding = encoding_result['encoding']
# 2. 分级读取策略
if confidence > 0.7:
df = pd.read_csv('messy_data.csv', encoding=encoding)
else:
# 低置信度时使用替换模式容错
df = pd.read_csv('messy_data.csv', encoding='utf-8', errors='replace')
# 修复替换产生的特殊字符
df = df.applymap(lambda x: str(x).replace('\ufffd', '?') if isinstance(x, str) else x)
# 3. 处理BOM头文件
if encoding == 'UTF-8-SIG':
df = pd.read_csv('messy_data.csv', encoding='utf-8-sig')
2. 非常规分隔符解析问题
症状表现:表格数据使用非逗号、制表符的复杂分隔符(如 "|||"、"###"),或存在分隔符在字段内部的情况。
解决方案:
# 1. 正则表达式分隔符
df = pd.read_csv('special_sep.csv', sep=r'\|\|\|', engine='python')
# 2. 处理字段内包含分隔符的情况
# 配合csv模块的quotechar参数
import csv
df = pd.read_csv('quoted_data.csv', sep=',', quotechar='"',
quoting=csv.QUOTE_ALL, engine='python')
缺失值处理的深层问题
1. 隐性缺失值识别困难
症状表现:df.isnull().sum()统计结果与实际缺失情况不符,存在用 "未知"、"N/A"、" " 等字符串表示的缺失值。
技术成因:原始数据中存在语义性缺失值,未被 Pandas 识别为NaN。
解决方案:
# 1. 构建完整的缺失值识别列表
missing_symbols = {'', ' ', 'NA', 'N/A', '未知', '无数据', 'NULL'}
df = pd.read_csv('data.csv', na_value