使用Pandas进行数据清洗

Pandas数据清洗

介绍

如果你对数据科学感兴趣,那么数据清洗可能是一个熟悉的术语。如果不熟悉,让我来解释一下。我们的数据通常来自多个资源,并且不干净。它可能包含缺失值、重复值、错误或不需要的格式等。在这些混乱的数据上运行实验会导致错误的结果。因此,在将数据提供给模型之前,有必要对数据进行准备。通过识别和解决潜在的错误、不准确性和不一致性,对数据进行准备的过程被称为数据清洗

在本教程中,我将向您介绍使用Pandas清洗数据的过程。

数据集

我将使用著名的鸢尾花数据集进行工作。鸢尾花数据集包含三个鸢尾花物种的四个特征的测量值:萼片长度、萼片宽度、花瓣长度和花瓣宽度。我们将使用以下库:

  • Pandas:用于数据处理和分析的强大库
  • Scikit-learn:提供数据预处理和机器学习工具

数据清洗的步骤

1. 加载数据集

使用Pandas的read_csv()函数加载鸢尾花数据集:

column_names = ['id', 'sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'species']
iris_data = pd.read_csv('data/Iris.csv', names= column_names, header=0)
iris_data.head()

输出:

id sepal_length sepal_width petal_length petal_width species
1 5.1 3.5 1.4 0.2 Iris-setosa
2 4.9 3.0 1.4 0.2 Iris-setosa
3 4.7 3.2 1.3 0.2 Iris-setosa
4 4.6 3.1 1.5 0.2 Iris-setosa
5 5.0 3.6 1.4 0.2 Iris-setosa

 

header=0参数表示CSV文件的第一行包含列名(标题)。

 

2. 探索数据集

 

为了了解我们的数据集,我们将使用pandas中的内置函数打印一些基本信息。

print(iris_data.info())
print(iris_data.describe())

 

输出:

RangeIndex: 150 entries, 0 to 149
Data columns (total 6 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   id            150 non-null    int64  
 1   sepal_length  150 non-null    float64
 2   sepal_width   150 non-null    float64
 3   petal_length  150 non-null    float64
 4   petal_width   150 non-null    float64
 5   species       150 non-null    object 
dtypes: float64(4), int64(1), object(1)
memory usage: 7.2+ KB
None

 

 

info()函数有助于了解数据框的整体结构,每列中非空值的数量以及内存使用情况。而摘要统计信息则提供了数据集中数值特征的概述。

 

3. 检查类别分布

 

这是了解分类列中类别分布的重要步骤,这对于分类任务非常重要。您可以使用pandas中的value_counts()函数执行此步骤。

print(iris_data['species'].value_counts())

 

输出:

Iris-setosa        50
Iris-versicolor    50
Iris-virginica     50
Name: species, dtype: int64

 

我们的结果显示数据集是平衡的,每个类别的表示数量相等。这为公平评估和对比提供了基础,涵盖了所有3个类别。

 

4. 移除缺失值

 

由于从info()方法可以明确看出我们有5个不含缺失值的列,因此我们将跳过此步骤。但是如果遇到任何缺失值,可以使用以下命令处理:

iris_data.dropna(inplace=True)

 

5. 移除重复值

 

重复值可能会扭曲我们的分析结果,因此我们将从数据集中移除它们。我们首先使用下面的命令检查它们的存在:

duplicate_rows = iris_data.duplicated()
print("Number of duplicate rows:", duplicate_rows.sum())

 

输出:

Number of duplicate rows: 0

 

对于这个数据集,我们没有任何重复值。然而,可以使用drop_duplicates()函数移除重复值。

iris_data.drop_duplicates(inplace=True)

 

6. One-Hot编码

 

对于分类分析,我们将对species列执行One-Hot编码。这一步是由于机器学习算法更适合处理数值数据的趋势。One-Hot编码过程将分类变量转换为二进制(0或1)格式。

encoded_species = pd.get_dummies(iris_data['species'], prefix='species', drop_first=False).astype('int')
iris_data = pd.concat([iris_data, encoded_species], axis=1)
iris_data.drop(columns=['species'], inplace=True)

 

 

7. 浮点值列的归一化

 

归一化是将数值特征缩放到均值为0,标准差为1的过程。此过程旨在确保特征对分析的贡献相等。我们将对浮点值列进行归一化,以实现一致的缩放。

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
cols_to_normalize = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
scaled_data = scaler.fit(iris_data[cols_to_normalize])
iris_data[cols_to_normalize] = scaler.transform(iris_data[cols_to_normalize])

 

 

8. 保存清洗后的数据集

 

将清洗后的数据集保存到新的 CSV 文件中。

iris_data.to_csv('cleaned_iris.csv', index=False)

 

总结

 

恭喜!您已经成功使用 pandas 清洗了第一个数据集。在处理复杂数据集时,您可能会遇到其他挑战。然而,这里提到的基本技术将帮助您入门并为数据分析做准备。

    Kanwal Mehreen 是一位有着对数据科学和医学人工智能应用浓厚兴趣的初级软件开发人员。Kanwal 被选为 2022 年亚太地区的 Google 代表学者。Kanwal 喜欢通过撰写关于热门主题的文章来分享技术知识,并热衷于改善科技行业中女性的代表性。