深入解析:使用Python实现数据清洗与预处理

昨天 6阅读

在数据分析和机器学习领域,数据清洗与预处理是不可或缺的步骤。无论是从数据库中提取的数据,还是从互联网爬取的信息,原始数据往往存在缺失值、异常值或格式不统一等问题。因此,在进行模型训练之前,必须对数据进行清洗和预处理。本文将通过一个具体案例,详细介绍如何使用Python完成数据清洗与预处理任务,并结合代码实例进行说明。


数据清洗与预处理的重要性

数据清洗(Data Cleaning)是指对原始数据进行检查、修正和转换,使其适合进一步分析的过程。常见的数据问题包括但不限于以下几种:

缺失值:某些字段没有值,可能是因为数据采集过程中出现错误。重复值:同一份数据可能被多次记录。异常值:某些数据点与其他数据点明显不同,可能是由于测量误差或人为输入错误。格式不一致:例如日期格式、字符串大小写等。

数据预处理(Data Preprocessing)则是在清洗的基础上,对数据进行标准化、归一化、编码等操作,以提高模型的训练效率和准确性。


技术栈选择

在Python中,pandas 是一个非常强大的库,专门用于数据处理和分析。它提供了灵活的DataFrame结构,可以轻松地加载、筛选、修改和保存数据。此外,numpymatplotlib 等库也可以辅助完成数值计算和可视化任务。

以下是本文的主要技术栈:

pandas:数据清洗与预处理的核心工具。numpy:支持高效的数值运算。matplotlib/seaborn:用于数据可视化。

案例分析:房价数据集的清洗与预处理

为了更好地说明数据清洗与预处理的过程,我们将使用一个假设的房价数据集。该数据集包含以下字段:

id:房屋唯一标识符price:房屋价格area:房屋面积bedrooms:卧室数量bathrooms:浴室数量year_built:建造年份location:地理位置
数据集示例
id,price,area,bedrooms,bathrooms,year_built,location1,500000,2000,3,2,2000,New York2,,1800,2,1,1990,Los Angeles3,600000,,4,3,2010,San Francisco4,700000,2200,3,2,2005,Chicago5,450000,1900,2,NaN,1980,Boston

数据清洗与预处理步骤

1. 加载数据

首先,我们需要使用 pandas 加载数据集。

import pandas as pd# 加载数据data = pd.read_csv('house_prices.csv')# 查看数据基本信息print(data.info())print(data.head())

输出结果如下:

<class 'pandas.core.frame.DataFrame'>RangeIndex: 5 entries, 0 to 4Data columns (total 7 columns): #   Column       Non-Null Count  Dtype  ---  ------       --------------  -----   0   id           5 non-null      int64   1   price        4 non-null      float64 2   area         3 non-null      float64 3   bedrooms     5 non-null      int64   4   bathrooms    4 non-null      float64 5   year_built   5 non-null      int64   6   location     5 non-null      object dtypes: float64(3), int64(3), object(1)memory usage: 320.0+ bytes

从上述信息可以看出,pricearea 列存在缺失值,bathrooms 列也存在一个缺失值。


2. 处理缺失值

缺失值的处理方式通常有以下几种:

删除含有缺失值的行。使用均值、中位数或众数填充缺失值。使用插值法或其他预测方法填补缺失值。

我们根据实际情况选择不同的策略。对于 pricearea 列,我们可以用中位数填充;对于 bathrooms 列,可以用众数填充。

# 填充缺失值data['price'].fillna(data['price'].median(), inplace=True)data['area'].fillna(data['area'].median(), inplace=True)data['bathrooms'].fillna(data['bathrooms'].mode()[0], inplace=True)# 再次检查数据print(data.isnull().sum())

输出结果:

id           0price        0area         0bedrooms     0bathrooms    0year_built   0location     0dtype: int64

3. 删除重复值

重复值可能会导致模型训练时出现偏差,因此需要删除。

# 检查并删除重复值data.drop_duplicates(inplace=True)print("是否有重复值:", data.duplicated().any())

4. 处理异常值

异常值通常是由于数据采集或录入错误造成的。我们可以使用箱线图(Boxplot)来检测异常值。

import matplotlib.pyplot as plt# 绘制箱线图plt.figure(figsize=(10, 6))plt.subplot(2, 2, 1)plt.boxplot(data['price'])plt.title('Price Boxplot')plt.subplot(2, 2, 2)plt.boxplot(data['area'])plt.title('Area Boxplot')plt.tight_layout()plt.show()# 移除异常值Q1 = data.quantile(0.25)Q3 = data.quantile(0.75)IQR = Q3 - Q1# 定义异常值范围data = data[~((data < (Q1 - 1.5 * IQR)) | (data > (Q3 + 1.5 * IQR))).any(axis=1)]

5. 标准化与归一化

在机器学习中,特征值的量纲差异可能会影响模型性能。因此,我们需要对数值型特征进行标准化或归一化。

from sklearn.preprocessing import StandardScaler, MinMaxScaler# 提取数值型列numeric_cols = ['price', 'area', 'bedrooms', 'bathrooms', 'year_built']# 标准化scaler = StandardScaler()data[numeric_cols] = scaler.fit_transform(data[numeric_cols])# 或者归一化min_max_scaler = MinMaxScaler()data[numeric_cols] = min_max_scaler.fit_transform(data[numeric_cols])

6. 类别型数据编码

对于类别型数据(如 location),我们需要将其转换为数值形式。常用的方法包括独热编码(One-Hot Encoding)和标签编码(Label Encoding)。

# 使用独热编码data = pd.get_dummies(data, columns=['location'], drop_first=True)# 或者使用标签编码from sklearn.preprocessing import LabelEncoderle = LabelEncoder()data['location'] = le.fit_transform(data['location'])

7. 保存清洗后的数据

最后,我们将清洗后的数据保存到新的CSV文件中。

# 保存数据data.to_csv('cleaned_house_prices.csv', index=False)

总结

通过上述步骤,我们完成了对房价数据集的清洗与预处理。整个过程包括以下几个关键环节:

加载数据并检查基本信息。处理缺失值和重复值。检测并移除异常值。对数值型特征进行标准化或归一化。对类别型特征进行编码。保存清洗后的数据。

这些步骤不仅适用于房价数据集,还可以扩展到其他类型的数据集。熟练掌握数据清洗与预处理技能,能够显著提升数据分析和建模的效果。

如果你正在处理类似的项目,不妨尝试将本文中的代码应用到你的实际场景中!

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

微信号复制成功

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