使用Python进行数据清洗:技术实践与代码示例
在现代数据分析和机器学习流程中,数据清洗(Data Cleaning) 是一个至关重要的步骤。高质量的数据是构建可靠模型的基础,而原始数据往往包含缺失值、异常值、重复记录或格式错误等问题。本文将详细介绍如何使用 Python 进行数据清洗,并结合实际案例展示相关技术。
我们将以一个虚构的电商销售数据集为例,逐步演示数据清洗的完整过程,包括:
加载数据检查数据完整性处理缺失值去除重复项异常值检测与处理数据类型转换标准化/规范化我们主要使用 pandas
和 numpy
作为核心工具库。
环境准备与数据加载
首先,确保你已经安装了必要的库:
pip install pandas numpy matplotlib seaborn
接下来,导入所需的模块并加载数据:
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns# 示例数据路径data_path = "sales_data.csv"# 加载数据df = pd.read_csv(data_path)# 显示前几行数据print(df.head())
假设我们的数据如下所示(sales_data.csv
):
OrderID | CustomerName | Product | Quantity | Price | OrderDate |
---|---|---|---|---|---|
1001 | Alice | A | 2 | 19.99 | 2023-01-01 |
1002 | Bob | B | -1 | 29.99 | 2023-01-02 |
1003 | Charlie | C | 3 | NaN | 2023-01-03 |
1004 | NaN | D | 5 | 49.99 | 2023-01-04 |
1005 | David | E | 2 | 59.99 | 2023-01-05 |
检查数据完整性
我们先对数据进行初步检查,查看是否存在缺失值、异常值等。
# 查看基本信息print(df.info())# 统计缺失值数量print(df.isnull().sum())# 描述性统计print(df.describe(include='all'))
输出结果可能显示:
CustomerName
列有缺失值;Price
列存在缺失值;Quantity
中存在负数(不合理订单数量)。处理缺失值
方法一:删除缺失值
适用于缺失比例较低的情况。
# 删除所有含有缺失值的行df_cleaned = df.dropna()print(df_cleaned.shape)
方法二:填充缺失值
适用于某些列可以合理推测缺失值的情况。
# 填充客户名称为"Unknown"df['CustomerName'] = df['CustomerName'].fillna("Unknown")# 填充价格为平均值mean_price = df['Price'].mean()df['Price'] = df['Price'].fillna(mean_price)print(df.isnull().sum())
去除重复项
# 查看是否有重复记录print(df.duplicated().sum())# 去重df_cleaned = df.drop_duplicates()print(df_cleaned.shape)
异常值检测与处理
例如,订单数量不应为负数。
# 检查Quantity是否大于0invalid_quantity = df_cleaned[df_cleaned['Quantity'] <= 0]print(invalid_quantity)# 修正异常值df_cleaned['Quantity'] = df_cleaned['Quantity'].apply(lambda x: abs(x) if x < 0 else x)# 再次检查print(df_cleaned[df_cleaned['Quantity'] <= 0])
还可以使用箱线图识别数值型字段中的异常值:
sns.boxplot(x=df_cleaned['Price'])plt.title('Price Distribution')plt.show()
数据类型转换
有时候需要将字符串类型的日期转为日期对象:
# 将OrderDate转为datetime类型df_cleaned['OrderDate'] = pd.to_datetime(df_cleaned['OrderDate'])# 提取年份、月份、星期几等信息df_cleaned['Year'] = df_cleaned['OrderDate'].dt.yeardf_cleaned['Month'] = df_cleaned['OrderDate'].dt.monthdf_cleaned['DayOfWeek'] = df_cleaned['OrderDate'].dt.dayofweekprint(df_cleaned.head())
标准化与规范化
例如,我们可以对价格进行标准化处理:
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()df_cleaned['Price_Standardized'] = scaler.fit_transform(df_cleaned[['Price']])print(df_cleaned[['Price', 'Price_Standardized']].head())
保存清洗后的数据
# 保存为新的CSV文件df_cleaned.to_csv("cleaned_sales_data.csv", index=False)
总结
数据清洗是一个系统工程,通常需要根据具体业务场景灵活处理。本篇文章介绍了以下关键技术点:
使用pandas
进行数据读取与基本操作;缺失值处理方法(删除与填充);去除重复项;异常值检测与修正;数据类型转换;特征提取与标准化。通过这些步骤,我们能够将原始数据转化为可用于建模或分析的“干净”数据集。
十、扩展阅读与建议
自动化清洗脚本:可将上述步骤封装为函数,便于复用。使用Dask处理超大数据集:对于超过内存限制的数据,可考虑使用dask.dataframe
。集成机器学习库:清洗完成后,可以直接使用 scikit-learn
或 xgboost
构建预测模型。可视化探索:结合 matplotlib
和 seaborn
进行数据分布探索,有助于发现潜在问题。如需进一步优化清洗流程,还可以引入日志记录、异常处理机制以及单元测试来提高代码健壮性。
如果你正在从事数据科学项目,务必重视数据清洗阶段——它往往是决定最终成果质量的关键一步。
免责声明:本文来自网站作者,不代表CIUIC的观点和立场,本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。客服邮箱:ciuic@ciuic.com