在 Pandas 中更正缺失数据
在本系列的第三部分“使用 Python 和 Pandas 进行数据清理”中,我们将深入探讨数据集可能包含的一些问题。
引言
本文是《使用 Python 和 Pandas 进行数据清洗》系列的一部分。其目标是帮助开发人员快速上手数据科学工具和技术。
如果您想查看该系列中的其他文章,可以在此处找到它们。
- 第一部分 - Jupyter 和 Pandas 入门
- 第二部分 - 将 CSV 和 SQL 数据加载到 Pandas 中
- 第三部分 - 在 Pandas 中更正缺失数据
- 第四部分 - 在 Pandas 中合并多个数据集
- 第五部分 - 在 Pandas DataFrame 中清理数据
- 第六部分 - 在 Pandas DataFrame 中重塑数据
- 第七部分 - 使用 Seaborn 和 Pandas 进行数据可视化
现在我们的数据已经加载并准备就绪,我们需要深入探讨数据集可能包含的一些问题。
请注意,我们为本系列模块创建了一个完整的 Jupyter Notebook,其中包含源数据文件,您可以 下载并本地安装。
大多数数据清理过程的第一步是分析数据集,以查找并处理任何缺失数据。当没有存储数据值时,通常会在数据集中出现缺失数据或缺失值,通常是在表单中不需要该值时,或者当它从其他变量计算得出时。数据集中缺失数据是一个非常普遍的现象,并可能对数据集的可视化和解释产生重大影响。
查找缺失数据元素
首先,在决定如何解释缺失值之前,我们必须找出缺失了多少数据以及哪些值是缺失的。Pandas DataFrame 有一些很好的方法可以做到这一点,包括:
isnull
方法检查每个字段是否为空。sum
方法将传递给它的字段相加。
首先,让我们开始一个新的代码块并输入以下内容:
customers.isnull()
这将写入表格,并检查表格中的每个字段是否为空值。让我们稍微扩展一下以获取摘要:
customers.isnull().sum()
结果如下
这提供了我们值的更好摘要,除了名字和姓氏之外,似乎有许多值需要修复。让我们看一下处理缺失数据时的一些可用选项。
使用 drop 和 dropna 删除 Pandas 缺失列
有时缺失值存在于我们无论如何都不太需要报告的列中,或者它们缺失的值很少,我们可以完全删除受影响的行。让我们使用以下方法删除一些不需要的值:
- drop 方法使用自定义过滤器删除列或行。
- dropna 方法删除包含空元素的列或行。
如果我们先看示例列,缺失值最多的三个项目中有两个是电子邮件和 street_num。这些数据元素通常是唯一的,虽然查看电子邮件域名(@符号之后的所有内容)可能很重要,但大多数时候我们不想对这些列进行太多报告,因此通过修改代码块将其删除:
customers.drop(columns='email', inplace=True)
customers.drop(columns='street_num', inplace=True)
customers.isnull().sum()
如果您现在运行此代码块,您将看到这两个列已从数据结构中删除。这使得缺失值可能稍好一些,尽管邮政编码列中的缺失项数量仍然很高,因此也删除邮政编码。
此外,我们将假设低至街道级别的可视化并不重要,因此我们也将删除这些列。需要注意的是,由于我们使用的是就地删除,因此您需要从头开始运行 notebook,否则会出错。
删除 Pandas 缺失行
接下来,我们将删除一些我们无法根据字段解释的行,特别是 city
和 state
。如果客户没有提供这些信息,我们将尝试删除这些行,看看这对我们的总数据有何影响。
开始一个新的代码块并添加以下内容:
customers.dropna(subset = ['city'], inplace=True)
print(customers.shape)
print(customers.isnull().sum())
这会删除 city 列中所有值为 null 的行。
您将看到,根据打印输出,我们现在在 city
字段中没有 null 值,并且记录数从 1000 减少到 921。
修改上面的代码,对 state
字段执行相同的删除过程。这将总字段数减少到 848,因此存在少量重叠,而 1000 条记录中的 848 条仍然相当不错。
替换值
这只剩下 gender
字段有空白值,但我们将对该字段使用不同的方法,并用静态值“Unspecified”替换它们。
fillna
方法使用指定的值填充列或行。
开始一个新的代码块并添加以下内容:
customers["gender"].fillna('Unspecified', inplace=True)
print(customers.shape)
print(customers.isnull().sum())
这会在 gender
列上扫描客户数据集,并将任何缺失值更改为“Unspecified”。
如果您现在查看输出,我们所有的列都有值。尽管我们没有仔细查看产品,但我们还将向产品 DataFrame 中 company 列的缺失值添加“Unspecified”值。
摘要
我们简要回顾了一些处理数据集中缺失值的简单选项。接下来,我们将看看如何将 DataFrame 合并到更大、更完整的数据集中,以便我们可以完成数据清理并开始可视化。
拼图图片来源:https://medium.com/@ODSC/missing-data-in-supervised-machine-learning-b6df0f02a731