使用Python进行数据清洗:从原始数据到可用数据集

今天 5阅读

在现代数据分析流程中,数据清洗(Data Cleaning) 是一个不可或缺的步骤。无论是在机器学习、商业智能还是数据可视化中,原始数据往往包含缺失值、异常值、重复记录等问题。如果不加以处理,这些“脏”数据会严重影响分析结果和模型性能。

本文将介绍如何使用 Python 和其流行的库如 Pandas、NumPy 进行数据清洗,并通过一个完整的示例演示整个过程。我们将使用一个模拟的数据集来展示常见的数据问题及对应的解决方案。


数据清洗的重要性

数据清洗是指识别并纠正数据集中的错误、重复、无效或不完整信息的过程。良好的数据清洗可以带来以下好处:

提高模型准确性减少计算资源浪费避免误导性增强数据一致性

工具准备

我们将使用以下 Python 库:

Pandas:用于数据操作与分析NumPy:用于数值计算Matplotlib/Seaborn(可选):用于数据可视化检查

安装依赖包(如果尚未安装):

pip install pandas numpy matplotlib seaborn

模拟数据集构建

我们先构造一个包含常见问题的模拟数据集:

import pandas as pdimport numpy as np# 构造数据data = {    '姓名': ['张三', '李四', '', '王五', None, '赵六', '张三'],    '年龄': [28, None, 34, -5, 40, 120, 28],    '性别': ['男', '女', '未知', '男', '女', '男', '男'],    '工资': [5000, 6000, '未知', 7000, None, 8000, 9000],    '部门': ['技术部', '市场部', '销售部', '市场部', '财务部', 'HR部', '技术部']}df = pd.DataFrame(data)print("原始数据:")print(df)

输出如下(部分省略):

   姓名   年龄  性别   工资   部门0  张三   28   男  5000  技术部1  李四  NaN   女  6000  市场部2       34  未知   未知  销售部3  王五   -5   男  7000  市场部4  None  40   女   NaN  财务部5  赵六  120   男  8000   HR部6  张三   28   男  9000  技术部

可以看到该数据集中存在以下问题:

缺失值(空字符串、None)异常值(年龄为负数、超过合理范围)数据类型不一致(工资字段混入了字符串)重复记录(姓名“张三”出现两次)

数据清洗步骤详解

1. 处理缺失值

我们可以用 isnull()isna() 检查缺失值:

print("缺失值统计:")print(df.isnull().sum())

输出:

姓名    1年龄    1性别    0工资    1部门    0dtype: int64

解决方案:

删除缺失值较多的行(适用于样本充足的情况)填充缺失值(适合小比例缺失)
# 填充缺失值df['姓名'].fillna('未知', inplace=True)df['年龄'].fillna(df['年龄'].median(), inplace=True)  # 用中位数填充df['工资'].replace({'未知': np.nan}, inplace=True)df['工资'] = pd.to_numeric(df['工资'], errors='coerce')df['工资'].fillna(df['工资'].mean(), inplace=True)print("\n缺失值处理后:")print(df)

2. 处理异常值

例如年龄不可能是负数或大于150岁:

# 修正年龄列df = df[(df['年龄'] >= 18) & (df['年龄'] <= 100)]print("\n去除异常年龄后的数据:")print(df)

3. 标准化分类变量

性别列中出现了“未知”,我们可以将其归类为“其他”:

df['性别'] = df['性别'].replace({'未知': '其他'})print("\n标准化性别列:")print(df[['姓名', '性别']])

4. 数据类型转换

工资列中包含字符串,需要统一为浮点型:

df['工资'] = pd.to_numeric(df['工资'], errors='coerce')df['工资'] = df['工资'].astype(float)print("\n工资列数据类型转换后:")print(df[['姓名', '工资']])

5. 去重

删除重复行(根据姓名判断是否重复):

df.drop_duplicates(subset=['姓名'], keep='first', inplace=True)print("\n去重后的数据:")print(df)

可视化检查(可选)

我们可以用 Matplotlib 或 Seaborn 对清洗后的数据进行初步可视化检查:

import matplotlib.pyplot as pltimport seaborn as snsplt.figure(figsize=(10, 5))# 工资分布图sns.histplot(df['工资'], bins=5, kde=True)plt.title('工资分布')plt.xlabel('工资')plt.ylabel('人数')plt.show()

保存清洗后的数据

最后,将清洗后的数据保存为 CSV 文件以供后续分析:

df.to_csv('cleaned_data.csv', index=False, encoding='utf-8-sig')print("数据已保存至 cleaned_data.csv")

总结

本文介绍了使用 Python 进行数据清洗的基本流程,包括处理缺失值、异常值、数据类型转换、标准化分类变量以及去重等操作。我们通过一个模拟数据集演示了每一步的具体实现方法,并给出了代码示例。

数据清洗虽然不是最吸引眼球的工作,但它对最终分析结果的影响却是决定性的。掌握好这一技能,将大大提升你的数据分析能力。


附录:完整代码汇总

import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns# 构建模拟数据data = {    '姓名': ['张三', '李四', '', '王五', None, '赵六', '张三'],    '年龄': [28, None, 34, -5, 40, 120, 28],    '性别': ['男', '女', '未知', '男', '女', '男', '男'],    '工资': [5000, 6000, '未知', 7000, None, 8000, 9000],    '部门': ['技术部', '市场部', '销售部', '市场部', '财务部', 'HR部', '技术部']}df = pd.DataFrame(data)# 处理缺失值df['姓名'].fillna('未知', inplace=True)df['年龄'].fillna(df['年龄'].median(), inplace=True)df['工资'].replace({'未知': np.nan}, inplace=True)df['工资'] = pd.to_numeric(df['工资'], errors='coerce')df['工资'].fillna(df['工资'].mean(), inplace=True)# 处理异常值df = df[(df['年龄'] >= 18) & (df['年龄'] <= 100)]# 标准化分类变量df['性别'] = df['性别'].replace({'未知': '其他'})# 去重df.drop_duplicates(subset=['姓名'], keep='first', inplace=True)# 可视化sns.histplot(df['工资'], bins=5, kde=True)plt.title('工资分布')plt.xlabel('工资')plt.ylabel('人数')plt.show()# 保存数据df.to_csv('cleaned_data.csv', index=False, encoding='utf-8-sig')print("清洗完成,数据已保存。")

如果你正在从事数据科学、机器学习或商业分析工作,熟练掌握数据清洗技巧将是你通往专业之路的重要一步。希望这篇文章对你有所帮助!

免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com

目录[+]

您是本站第17021名访客 今日有34篇新文章

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!