使用Python进行数据清洗与预处理:实战指南

41分钟前 4阅读

在数据科学和机器学习项目中,数据清洗和预处理是至关重要的一步。原始数据通常包含噪声、缺失值、异常值或格式不一致的问题,这些问题如果不加以处理,将直接影响模型的性能和结果的准确性。本文将详细介绍如何使用 Python 进行数据清洗与预处理,并提供完整的代码示例。

我们将使用 PandasNumPy 这两个常用的 Python 数据分析库来完成任务。


准备工作

首先,我们需要安装必要的库:

pip install pandas numpy scikit-learn

然后导入所需的模块:

import pandas as pdimport numpy as npfrom sklearn.preprocessing import StandardScaler

加载数据集

我们以一个简单的 CSV 文件为例,模拟一个电商销售数据集。假设文件名为 sales_data.csv,内容如下:

OrderIDCustomerNameProductQuantityPriceDiscount
101AliceLaptop29990.1
102BobMouseNaN19.990
103CharlieKeyboard1-500.2
104NaNMonitor1199NaN
105DavidHeadphone389.990.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)

如果我们要对 ProductCustomerName 等类别变量进行建模,需要将其转换为数值形式。常用的方法有 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 技术手段,我们可以高效地完成这些任务,为后续的数据分析和建模打下坚实基础。

如果你正在从事数据科学相关工作,掌握这些技能将极大地提升你的效率和模型表现力。希望这篇文章能为你提供实用的参考和帮助!

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

目录[+]

您是本站第74809名访客 今日有13篇新文章

微信号复制成功

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