使用Python进行数据清洗:从原始数据到可用数据集
在现代数据分析流程中,数据清洗(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("清洗完成,数据已保存。")
如果你正在从事数据科学、机器学习或商业分析工作,熟练掌握数据清洗技巧将是你通往专业之路的重要一步。希望这篇文章对你有所帮助!