当前位置: 首页 > news >正文

数据清洗(Data Cleansing)新手教学简单易懂(缺失值、异常值、重复数据、不一致数据、格式问题),附实战案例


数据清洗(Data Cleaning)详解

一、什么是数据清洗

数据清洗(Data Cleaning,又称 Data Cleansing 或 Data Scrubbing)是数据预处理中的核心环节。它的目标是 识别并修正数据中的错误、不一致或缺失部分,以提高数据质量,从而为后续的数据分析、建模和机器学习提供可靠基础。

在真实场景中,原始数据往往存在以下问题:

  • 缺失值:例如某些用户没有填写邮箱或年龄。

  • 异常值:某条记录的年龄为 200 岁,或工资为负数。

  • 重复数据:同一用户被录入多次。

  • 不一致数据:如性别字段中同时出现 Mmale

  • 格式问题:日期格式混乱,如 2025/08/1818-08-2025 混用。

如果不进行清洗,分析结果可能会严重偏差。


二、数据清洗的常见步骤

1. 缺失值处理

缺失值是最常见问题。处理方式包括:

  • 删除法:直接删除包含缺失值的行或列(适合缺失率高的情况)。

  • 填充法:用均值、中位数、众数或插值方法补全。

  • 模型预测:使用机器学习算法预测缺失值。

方法说明适用场景优缺点
删除法直接删除包含缺失值的行或列当缺失值比例较高,且该行/列对整体分析影响不大时✅ 简单快速;❌ 可能丢失有用信息
填充法均值、中位数、众数或插值方法补全当缺失值比例较小,且数据分布规律明显时✅ 保留更多数据;❌ 可能引入偏差
模型预测

使用机器学习模型(如 KNN、回归)预测缺失值

(将其他完整的列作为特征,缺失值的列作为标签,进行训练预测)

当数据复杂、缺失值对结果影响较大时✅ 填充值更合理;❌ 计算复杂度高,需额外建模

示例(Pandas):

import pandas as pd
import numpy as np# 构造样例数据
df = pd.DataFrame({"姓名": ["张三", "李四", "王五", "赵六"],"年龄": [25, np.nan, 30, 28],"工资": [5000, 6000, None, 8000]
})# 缺失值填充
df["年龄"].fillna(df["年龄"].mean(), inplace=True)   # 用均值填充
df["工资"].fillna(df["工资"].median(), inplace=True) # 用中位数填充

1. 函数作用

Pandas 中,fillna() 用于 填充缺失值 (NaN)
常见于 DataFrameSeries 对象,用来替换空值,使数据更加完整。


2. 基本语法

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)


3. 参数解析

参数说明
value用于替换缺失值的值,可以是标量、字典或 Series。例如 df.fillna(0),所有 NaN 填充为 0。
method采用插值法填充:
- ffill (前向填充):用前一个非 NaN 值填充
- bfill (后向填充):用后一个非 NaN 值填充
axis填充方向:
- 0'index'(按列填充)
- 1'columns'(按行填充)
inplace是否在原对象上直接修改:
- False(默认,返回新对象)
- True(直接修改原对象,不返回)
limit限制填充的次数。例如 limit=1 只填充一次缺失值,剩下的保留 NaN。
downcast尝试将填充值转换为合适的更小的数据类型,比如从 float64 转成 int32

2. 异常值检测与处理

异常值会严重影响模型。常见方法:

  • 箱线图法(IQR):利用四分位距检测异常值。

  • Z-Score 方法:根据数据分布的标准差判断。

  • 逻辑规则:如年龄不能小于 0,工资不可能为负数。

示例(Z-Score):

from scipy import stats# 检测工资异常值
z_scores = stats.zscore(df["工资"])
df = df[(abs(z_scores) < 3)]  # 保留 |Z|<3 的数据

3. 重复数据处理

重复记录会影响统计和建模,常用方法:

# 删除重复行
df = df.drop_duplicates()

4. 数据标准化与一致化

实际数据可能存在不同的表示方法:

  • 性别字段:M/F男/女1/0

  • 日期字段:2025-08-182025/8/18

处理方式:

# 性别字段统一
df["性别"] = df["性别"].replace({"男": "M", "女": "F"})

5. 数据格式规范化

确保数据类型正确:

# 转换日期字段
df["日期"] = pd.to_datetime(df["日期"], errors="coerce")# 转换数值字段
df["工资"] = pd.to_numeric(df["工资"], errors="coerce")

三、数据清洗在项目中的意义

  • 提升数据质量:减少噪声和偏差。

  • 增强模型性能:机器学习模型对“脏数据”很敏感。

  • 节省分析成本:避免在错误数据上浪费计算和决策。

  • 确保结果可靠:让分析结论更符合业务逻辑。


四、案例:员工数据清洗

假设我们有一份员工数据,部分字段存在缺失、重复、异常情况。

import pandas as pd
import numpy as npdata = {"姓名": ["张三", "李四", "王五", "李四"],"性别": ["男", "女", "M", "male"],"年龄": [25, 200, 30, 29],"工资": [5000, 6000, None, -1000],"入职日期": ["2022-01-05", "20220110", "2022/01/15", "2022-01-20"]
}df = pd.DataFrame(data)
print("数据清洗前:\n",df)# 1. 缺失值处理
df["工资"].fillna(df["工资"].median(), inplace=True)# 2. 异常值处理(逻辑规则)
df.loc[df["年龄"] > 100, "年龄"] = df["年龄"].median()
df.loc[df["工资"] < 0, "工资"] = df["工资"].median()# 3. 重复数据去重
df = df.drop_duplicates()# 4. 一致化
df["性别"] = df["性别"].replace({"男": "M", "女": "F", "male": "M"})# 5. 日期规范化
df["入职日期"] = pd.to_datetime(df["入职日期"], errors="coerce")print("数据清洗后:\n",df)

清洗后,数据更干净,适合后续分析。


五、总结

数据清洗是数据科学和机器学习流程中至关重要的一步。主要目标是 去除噪声、修正错误、统一格式、处理缺失与异常
在实践中,可以结合 Pandas、NumPy、正则表达式、机器学习算法 等工具,构建自动化的数据清洗流程。

一句话总结:

没有高质量数据,就没有高质量模型。数据清洗是数据分析的第一步,也是最重要的一步。

http://www.dtcms.com/a/338115.html

相关文章:

  • php8.+ 新函数总结
  • 了解Arthas-7788
  • GO学习记录六——集成Swagger接口测试页面
  • Three.js 坐标系系统与单位理解教程
  • 安装pnpm i -D @types/wechat-miniprogram报错,版本不匹配
  • 使用 Zed + Qwen Code 搭建轻量化 AI 编程 IDE
  • 【CF】Day129——杂题 (状压DP + 图论 | 贪心 + 数论 + 构造 | 构造 + 贪心 | 构造 + 模拟)
  • Python装饰器:从入门到精通
  • 【STM32】SPI 与 Flash 笔记
  • 【深度长文】Anthropic发布Prompt Engineering全新指南
  • 启发式合并
  • 1、代码相关优化建议
  • 数据分析进阶——解读文本分析模型【附全文阅读】
  • 第十六届蓝桥杯青少组C++省赛[2025.8.10]第二部分编程题(5、环形取硬币游戏)
  • 虚幻基础:动作时间窗
  • Kafka文件存储机制
  • 录音转文字,如何做到“快、准、狠“多格式通吃?
  • 自学中医笔记(二)
  • 大模型对齐算法(四): DAPO,VAPO,GMPO,GSPO, CISPO,GFPO
  • 如何平衡电竞酒店和高校宿舍对AI云电竞游戏盒子的不同需求?
  • 【Python】Python 多进程与多线程:从原理到实践
  • NVIDIA CWE 2025 上海直击:从 GPU 集群到 NeMo 2.0,企业 AI 智能化的加速引擎
  • 软件定义汽车---创新与差异化之路
  • C/C++ 中 str、str、*str 在指针语境下的具体含义(以 char* str 为例):
  • 深化中东战略承诺,联想集团宣布在利雅得设区域总部
  • wait / notify、单例模式
  • 【深度学习基础】PyTorch Tensor生成方式及复制方法详解
  • 【每日一题】Day 7
  • Linux——进程间、线程间的通信
  • 【C++】 using声明 与 using指示