数据清洗工程实践:基于 pandas 的八类典型问题与处理规范

📅 2026/8/21 21:28:02
数据清洗工程实践:基于 pandas 的八类典型问题与处理规范
在数据分析与机器学习项目中数据清洗通常占据一半以上的工作量。本文基于一次真实成绩数据的清洗经历数千条教务系统导出记录归纳八类高频脏数据问题及其标准处理方式并给出可复用的处理规范。〇、两条前置原则原始数据只读。原始文件置于独立目录如raw/并保持只读所有处理结果输出至processed/。任何情况下不直接修改原始文件。处理过程脚本化。禁止使用 Excel 手工修改数据。所有清洗逻辑以脚本实现保证可重复执行、可追溯。手工修改的数据在事后无法还原修改内容。import pandas as pd import numpy as np df pd.read_csv(raw/scores.csv) df_backup df.copy() # 内存中保留原始副本一、清洗前的数据体检开始处理前先用以下命令建立对数据的整体认识df.shape # 行列规模 df.dtypes # 各列类型数值列被读为字符串是常见问题 df.head(10) # 直接观察数据内容 df.isnull().sum() # 各列缺失数量 df.describe(includeall) # 数值列分布与文本列取值个数其中dtypes需重点检查若成绩列类型为object说明列内混入了非数值内容如缺考缓考此时直接计算统计量会报错或产生错误结果。二、八类典型问题与处理方法1. 缺失值先分析成因再决定策略missing_rate df.isnull().mean().sort_values(ascendingFalse) print(missing_rate[missing_rate 0])处理决策建议缺失率超过 60% 的列删除df.drop(columns[...])该列已不具备分析价值数值列少量缺失以中位数填充df[score].fillna(df[score].median())——中位数对极端值鲁棒优于均值类别列缺失填充为独立类别fillna(未知)。缺失本身可能携带信息不宜简单删除避免无差别使用dropna()整行删除会损失大量有效信息仅在其他方法均不适用时采用。2. 重复记录区分完全重复与业务重复df.duplicated().sum() # 完全重复的行 df df.drop_duplicates() # 业务层面的重复同一学生同一学期出现多条记录 df.duplicated(subset[学号, 学期]).sum() df df.drop_duplicates(subset[学号, 学期], keeplast)keep参数的取值取决于业务语义后录入覆盖先录入或相反。无法确认时应向数据提供方求证不应自行假设。3. 类型混杂数值列中混入文本df[score] pd.to_numeric(df[score], errorscoerce) # 无法转换的置为 NaN参数errorscoerce将无法解析的值统一转为 NaN随后纳入缺失值处理流程避免转换异常中断执行。4. 异常值以 IQR 准则识别以业务判断处置Q1 df[score].quantile(0.25) Q3 df[score].quantile(0.75) IQR Q3 - Q1 lower, upper Q1 - 1.5 * IQR, Q3 1.5 * IQR outliers df[(df[score] lower) | (df[score] upper)] print(f识别出 {len(outliers)} 个异常值)识别异常值不等于删除异常值。超出合理区间的取值如百分制下出现 150 分大概率为录入错误可修正或剔除但统计意义上的离群点可能是真实且重要的样本如欺诈检测场景中异常样本正是分析目标。处置前应逐条核实。5. 文本不规范同一实体的多种写法df[专业].value_counts() # 可能输出计算机科学与技术、计算机、计科、CS、计算机科学 ……标准化处理的一般顺序df[专业] df[专业].str.strip() # 去除首尾空格 df[专业] df[专业].str.replace( , ) # 去除全角空格 mapping {计科: 计算机科学与技术, CS: 计算机科学与技术, ...} df[专业] df[专业].replace(mapping)首尾空格是高频隐患计算机与 计算机在分组统计中被视为不同取值。聚合结果出现疑似重复的类别时应首先检查空格问题。6. 日期格式统一df[日期] pd.to_datetime(df[日期], errorscoerce)pd.to_datetime可识别多数常见格式2024-01-01、2024/1/1、2024年1月1日等。转换完成后可便捷地提取时间特征df[日期].dt.year # 年 df[日期].dt.month # 月 df[日期].dt.dayofweek # 星期7. 类别编码区分有序与无序文本特征入模前必须编码编码方式取决于类别是否具有序关系# 有序类别如等级 ABCD映射为数值保留序关系 grade_map {A: 4, B: 3, C: 2, D: 1} df[等级编码] df[等级].map(grade_map) # 无序类别如专业one-hot 编码 df pd.get_dummies(df, columns[专业], prefix专业)不应对无序类别使用序号编码0, 1, 2, …这会向模型引入并不存在的序关系如计算机(2) 大于 机械(1)属于初学阶段的高频错误。8. 结果保存df.to_csv(processed/scores_clean.csv, indexFalse, encodingutf-8-sig)两点说明encodingutf-8-sig带 BOM 的 UTF-8 编码可保证中文 CSV 在 Excel 中正常显示普通 UTF-8 编码的 CSV 用 Excel 打开会出现乱码。中间结果规模较大时建议使用 Parquet 格式to_parquet()体积与读写速度较 CSV 有数量级优势且保留列类型信息。三、应当避免的做法做法问题在 Excel 中手工修改数据不可复现、不可追溯无差别dropna()损失大量有效样本缺失值一律填 00 是有效数值会污染统计量与模型发现异常值直接删除异常值可能正是重要信息清洗后不重新验证每轮清洗后应重新执行数据体检四、处理日志一项低成本高收益的习惯建议每次清洗完成后保留简要记录2024-XX-XX 清洗记录 - 原始 5231 行 → 去重后 5180 行剔除完全重复 51 条 - score 列12 条缺考转为 NaN以中位数 72 填充 - 专业列合并 7 个别名统一去除首尾空格 - 剔除异常值 3 条score 100经与数据提供方确认为录入错误该日志在项目复盘与求职面试中均有直接价值——处理过什么数据远不如遇到什么问题、如何解决、依据是什么具有说服力。五、小结数据清洗没有统一的固定流程但有稳定的方法论先体检、再分类处置、处置后验证、全程留痕。掌握本文的八类问题及其处理规范足以应对本科阶段绝大多数表格数据场景。下一篇讨论计算机视觉项目的技术选型问题传统图像处理方法与深度学习方法各自的适用范围及判断依据。