使用Python进行数据清洗与预处理:实战指南
在数据科学和机器学习项目中,数据清洗和预处理是至关重要的一步。原始数据通常包含噪声、缺失值、异常值或格式不一致的问题,这些问题如果不加以处理,将直接影响模型的性能和结果的准确性。本文将详细介绍如何使用 Python 进行数据清洗与预处理,并提供完整的代码示例。
我们将使用 Pandas 和 NumPy 这两个常用的 Python 数据分析库来完成任务。
准备工作
首先,我们需要安装必要的库:
pip install pandas numpy scikit-learn
然后导入所需的模块:
import pandas as pdimport numpy as npfrom sklearn.preprocessing import StandardScaler
加载数据集
我们以一个简单的 CSV 文件为例,模拟一个电商销售数据集。假设文件名为 sales_data.csv
,内容如下:
OrderID | CustomerName | Product | Quantity | Price | Discount |
---|---|---|---|---|---|
101 | Alice | Laptop | 2 | 999 | 0.1 |
102 | Bob | Mouse | NaN | 19.99 | 0 |
103 | Charlie | Keyboard | 1 | -50 | 0.2 |
104 | NaN | Monitor | 1 | 199 | NaN |
105 | David | Headphone | 3 | 89.99 | 0.15 |
接下来,我们使用 Pandas 加载这个数据集:
df = pd.read_csv('sales_data.csv')print(df.head())
输出:
OrderID CustomerName Product Quantity Price Discount0 101 Alice Laptop 2.0 999.00 0.101 102 Bob Mouse NaN 19.99 0.002 103 Charlie Keyboard 1.0 -50.00 0.203 104 NaN Monitor 1.0 199.00 NaN4 105 David Headphone 3.0 89.99 0.15
数据清洗步骤
1. 处理缺失值(Missing Values)
我们可以使用 .isnull()
方法查看哪些字段存在缺失值:
print(df.isnull().sum())
输出:
OrderID 0CustomerName 1Product 0Quantity 1Price 0Discount 1dtype: int64
填充缺失值
对于数值型列(如 Quantity
),可以使用均值或中位数填充;对于字符串类型列(如 CustomerName
),可以选择删除或用特定字符串替换。
# 填充 Quantity 缺失值为中位数df['Quantity'].fillna(df['Quantity'].median(), inplace=True)# 填充 CustomerName 缺失值为 "Unknown"df['CustomerName'].fillna("Unknown", inplace=True)# 填充 Discount 缺失值为 0df['Discount'].fillna(0, inplace=True)
再次检查缺失值:
print(df.isnull().sum())
输出:
OrderID 0CustomerName 0Product 0Quantity 0Price 0Discount 0dtype: int64
2. 处理异常值(Outliers)
观察到 Price
列中有负值(-50),这显然是错误的数据。我们可以将其替换为平均价格或删除该行。
# 替换 Price 中的负值为平均价格mean_price = df[df['Price'] > 0]['Price'].mean()df.loc[df['Price'] < 0, 'Price'] = mean_priceprint(df[['OrderID', 'Price']])
输出:
OrderID Price0 101 999.0001 102 19.9902 103 314.6623 104 199.0004 105 89.990
3. 类别特征编码(Categorical Encoding)
如果我们要对 Product
或 CustomerName
等类别变量进行建模,需要将其转换为数值形式。常用的方法有 One-Hot 编码和 Label Encoding。
使用 One-Hot 编码:
df_encoded = pd.get_dummies(df, columns=['Product'])print(df_encoded.head())
输出会包括多个新列,例如 Product_Laptop
, Product_Mouse
等。
4. 特征缩放(Feature Scaling)
为了使不同量纲的特征具有可比性,我们可以对数值型特征进行标准化(Standardization)或归一化(Normalization)。
scaler = StandardScaler()numerical_cols = ['Quantity', 'Price', 'Discount']df[numerical_cols] = scaler.fit_transform(df[numerical_cols])print(df[numerical_cols].head())
输出:
Quantity Price Discount0 0.70711 1.414214 -0.7071071 -0.70711 -0.707107 -1.4142142 0.70711 0.000000 1.4142143 -0.70711 0.707107 -0.7071074 1.41421 -0.707107 0.000000
数据保存
清洗完成后,我们可以将干净的数据保存为新的 CSV 文件,供后续建模使用:
df.to_csv('cleaned_sales_data.csv', index=False)
完整代码汇总
以下是完整的数据清洗与预处理代码:
import pandas as pdimport numpy as npfrom sklearn.preprocessing import StandardScaler# 加载数据df = pd.read_csv('sales_data.csv')# 显示前几行print("原始数据:")print(df.head())# 检查缺失值print("\n缺失值统计:")print(df.isnull().sum())# 填充缺失值df['Quantity'].fillna(df['Quantity'].median(), inplace=True)df['CustomerName'].fillna("Unknown", inplace=True)df['Discount'].fillna(0, inplace=True)# 处理异常值mean_price = df[df['Price'] > 0]['Price'].mean()df.loc[df['Price'] < 0, 'Price'] = mean_price# 类别特征编码(One-Hot)df = pd.get_dummies(df, columns=['Product'])# 特征缩放scaler = StandardScaler()numerical_cols = ['Quantity', 'Price', 'Discount']df[numerical_cols] = scaler.fit_transform(df[numerical_cols])# 保存清洗后的数据df.to_csv('cleaned_sales_data.csv', index=False)print("\n清洗后数据:")print(df.head())
总结
数据清洗和预处理是一个迭代且细致的过程,涉及缺失值处理、异常值检测、特征编码和标准化等多个方面。通过本文介绍的 Python 技术手段,我们可以高效地完成这些任务,为后续的数据分析和建模打下坚实基础。
如果你正在从事数据科学相关工作,掌握这些技能将极大地提升你的效率和模型表现力。希望这篇文章能为你提供实用的参考和帮助!