65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Pandas 中更正缺失数据

starIconstarIconstarIconstarIconstarIcon

5.00/5 (13投票s)

2020 年 5 月 29 日

CPOL

5分钟阅读

viewsIcon

9754

downloadIcon

195

在本系列的第三部分“使用 Python 和 Pandas 进行数据清理”中,我们将深入探讨数据集可能包含的一些问题。

引言

本文是《使用 Python 和 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 缺失行

接下来,我们将删除一些我们无法根据字段解释的行,特别是 citystate。如果客户没有提供这些信息,我们将尝试删除这些行,看看这对我们的总数据有何影响。

开始一个新的代码块并添加以下内容:

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

© . All rights reserved.