获取文中的CSV文件用于代码编程以及文章首发地址,请点击下方超链接

获取CSV,用于编程调试请点这

在本文中,咱们将应用PythonPandas库逐渐实现许多不同的数据清理工作。具体而言,咱们将重点关注可能是最大的数据清理工作,即 短少值。

缺失值的起源

在深入研究代码之前,理解失落数据的起源很重要。这是数据失落的一些典型起因:

  • 用户遗记填写字段。
  • 从旧版数据库手动传输时,数据失落。
  • 产生编程谬误。
  • 用户抉择不填写字段。

其中一些起源只是简略的随机谬误。在其余时候,可能会有更深层的起因导致数据失落。

筹备工作

在开始清理数据集之前,最好先大抵理解一下数据。

  • 有哪些性能?
  • 预期的类型是什么(int,float,string,boolean)?
  • 是否有显著的缺失数据(熊猫能够检测到的值)?
  • 是否还有其余类型的失落数据不太显著(无奈通过Pandas轻松检测到)?

了阐明我的意思,让咱们开始钻研示例。

咱们要应用的数据是十分小的房地产数据集。获取CSV文件。你能够单击此处获取,以便能够进行编码。

疾速浏览一下数据:

疾速理解数据的一种好办法是查看前几行。在Pandas中,你要编写以下代码:

# Importing librariesimport pandas as pdimport numpy as np# Read csv file into a pandas dataframedf = pd.read_csv("property data.csv")# Take a look at the first few rowsprint df.head()
Out:   ST_NUM    ST_NAME OWN_OCCUPIED  NUM_BEDROOMS0   104.0     PUTNAM            Y           3.01   197.0  LEXINGTON            N           3.02     NaN  LEXINGTON            N           3.03   201.0   BERKELEY          NaN           1.04   203.0   BERKELEY            Y           3.0

我晓得我说过咱们将应用Pandas,然而能够看到我也应用了Numpy。稍后咱们将应用它来重命名一些缺失的值。

导入库后,咱们将csv文件读取到Pandas数据框中。

应用该办法,咱们能够轻松看到前几行。(应用.head()办法)

从列名称中推断出以下字符组非常容易:

  • ST_NUM: 街道号码
  • ST_NAME: 街道名称
  • OWN_OCCUPIED:住所所有人是否被占用
  • NUM_BEDROOMS:卧室数

咱们还能够进行设置,获取的数据类型是啥?

  • ST_NUM:float或int…某种数字类型
  • ST_NAME: 细绳
  • OWN_OCCUPIED:字符串…Y(“是”)或N(“否”)
  • NUM_BEDROOMS:float或int,数字类型

规范缺失值

“规范缺失值”是什么意思?这些是Pandas能够检测到的缺失值。

回到咱们的原始数据集,让咱们看一下“ ST_NUM”列。

第三列中有一个空单元格。在第七行中,有一个“ NA”值。

显然,这些都是缺失值。让咱们看看Pandas如何解决这些问题

# 查看ST_NUM列print df['ST_NUM']print df['ST_NUM'].isnull()
# 查看ST_NUM列Out:0    104.01    197.02      NaN3    201.04    203.05    207.06      NaN7    213.08    215.0Out:0    False1    False2     True3    False4    False5    False6     True7    False8    False

看一下该列,咱们能够看到Pandas在空白处填充了“ NA”。应用该办法,咱们能够确认缺失值和“ NA”都被辨认为缺失值。两个布尔响应均为。isnull()True

这是一个简略的示例,但强调了一个重点。Pandas会将空单元格和“ NA”类型都辨认为缺失值。 上面,我将介绍一些Pandas无奈辨认的类型。

非标准缺失值

有时可能是短少具备不同格局的值的状况。

让咱们看一下“Number of Bedrooms”一栏,理解我的意思。

在此列中,有四个缺失值。

  • n/a
  • NA
  • na

从下面中,咱们晓得Pandas会将“ NA”辨认为缺失值,但其余的状况呢?让咱们来看看。

# 看NUM_BEDROOMS这一栏print df['NUM_BEDROOMS']print df['NUM_BEDROOMS'].isnull()
Out:0      31      32    n/a3      14      35    NaN6      27     --8     naOut:0    False1    False2    False3    False4    False5     True6    False7    False8    False

就像以前一样,Pandas认为“ NA”是缺失的价值。可怜的是,其余类型未被辨认。

如果有多个用户手动输出数据,则这是一个常见问题。兴许我喜爱应用“ n / a”,然而其他人喜爱应用“ na”。

检测这些各种格局的一种简略办法是将它们放在列表中。而后,当咱们导入数据时,Pandas会立刻辨认出它们。这是咱们将如何执行此操作的示例。

# 列出缺失的值类型missing_values = ["n/a", "na", "--"]df = pd.read_csv("property data.csv", na_values = missing_values)

当初,让咱们再看一下该栏,看看会产生什么。

# 看NUM_BEDROOMS这一栏print df['NUM_BEDROOMS']print df['NUM_BEDROOMS'].isnull()
Out:0    3.01    3.02    NaN3    1.04    3.05    NaN6    2.07    NaN8    NaNOut:0    False1    False2     True3    False4    False5     True6    False7     True8     True

上面中,咱们将介绍一种更简单但很常见的缺失值类型。

意外的缺失值

到目前为止,咱们曾经看到了规范缺失值和非标准缺失值。如果咱们出现意外类型怎么办?

例如,如果咱们的性能应该是字符串,然而有数字类型,那么从技术上讲,这也是一个缺失值。

让咱们看一下“Owner Occupied**”一栏,看看我在说什么。

从后面的示例中,咱们晓得Pandas将检测到第7行中的空单元格为缺失值。让咱们用一些代码进行确认。

# 查看OWN_OCCUPIED列print df['OWN_OCCUPIED']print df['OWN_OCCUPIED'].isnull()
# 查看OWN_OCCUPIED列Out:0      Y1      N2      N3     124      Y5      Y6    NaN7      Y8      YOut:0    False1    False2    False3    False4    False5    False6     True7    False8    False

在第四行中,数字为12。Owner Occupied的响应显然应该是字符串(Y或N),因而此数字类型应为缺失值

这个示例略微简单一点,因而咱们须要思考一种策略来检测这些类型的缺失值。有很多不同的办法,然而这是我要通过这种办法工作的形式。

  • 遍历OWN_OCCUPIED列
  • 尝试将条目转换为整数
  • 如果条目能够更改为整数,请输出缺失值
  • 如果数字不能是整数,咱们晓得它是一个字符串,所以持续

看一下代码,而后我将对其进行具体介绍

# 检测数据cnt=0for row in df['OWN_OCCUPIED']:    try:        int(row)        df.loc[cnt, 'OWN_OCCUPIED']=np.nan    except ValueError:        pass    cnt+=1

在代码中,咱们循环浏览“所有者已占用”列中的每个条目。要尝试将条目更改为整数,咱们应用。int(row)

如果能够将值更改为整数,则能够应用Numpy's将条目更改为短少的值。np.nan

另一方面,如果不能将其更改为整数,咱们pass将持续。

您会留神到我应用tryexcept ValueError。这称为异样解决,咱们应用它来处理错误。

如果咱们尝试将一个条目更改为一个整数并且无奈更改,则将ValueError返回a,并且代码将进行。为了解决这个问题,咱们应用异样解决来辨认这些谬误,并持续进行上来。

代码的另一个重要局部是.loc办法。这是用于批改现有条目标首选Pandas办法。无关此的更多信息,请查看Pandas文档。

当初,咱们曾经钻研了检测缺失值的不同办法,上面将概述和替换它们。

总结缺失值

革除缺失的值后,咱们可能要对它们进行汇总。例如,咱们可能要查看每个性能的缺失值总数。

# Total missing values for each featureprint df.isnull().sum()
Out:ST_NUM          2ST_NAME         0OWN_OCCUPIED    2NUM_BEDROOMS    4

在更多的时候,咱们可能须要进行疾速查看,以查看是否基本短少任何值。

# Any missing values?print df.isnull().values.any()
Out:True

咱们可能还心愿取得缺失值的总数。

# Total number of missing valuesprint df.isnull().sum().sum()
Out:8

在下面,咱们总结了缺失值的数量,让咱们看一下如何进行一些简略的替换。

更换

通常,您必须弄清楚如何解决缺失值。

有时,您只是想删除这些行,而其余时候,您将替换它们。

正如我之前提到的,这不应该漫不经心。咱们将介绍一些根本的推论。

# 用一个数字替换缺失的值df['ST_NUM'].fillna(125, inplace=True)

如果进行基于地位的插补。

# 基于地位的更换df.loc[2,'ST_NUM'] = 125

替换缺失值的一种十分常见的办法是应用中位数。

# 取代应用中位数median = df['NUM_BEDROOMS'].median()df['NUM_BEDROOMS'].fillna(median, inplace=True)