获取文中的
CSV
文件
用于代码编程以及文章首发地址,请点击下方超连接
在本文中,咱们将使用Python
的Pandas
库逐步完成许多不一样的数据清理任务。具体而言,咱们将重点关注多是最大的数据清理任务,即 缺乏值。编程
在深刻研究代码以前,了解丢失数据的来源很重要。这是数据丢失的一些典型缘由:编码
其中一些来源只是简单的随机错误。在其余时候,可能会有更深层的缘由致使数据丢失。spa
在开始清理数据集以前,最好先大体了解一下数据。调试
int,float,string,boolean
)?了说明个人意思,让咱们开始研究示例。code
咱们要使用的数据是很是小的房地产数据集。获取CSV
文件。你能够单击此处获取,以即可以进行编码。图片
快速浏览一下数据:rem
快速了解数据的一种好方法是查看前几行。在Pandas
中,你要编写如下代码:文档
# Importing libraries import pandas as pd import numpy as np # Read csv file into a pandas dataframe df = pd.read_csv("property data.csv") # Take a look at the first few rows print df.head()
Out: ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS 0 104.0 PUTNAM Y 3.0 1 197.0 LEXINGTON N 3.0 2 NaN LEXINGTON N 3.0 3 201.0 BERKELEY NaN 1.0 4 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.0 1 197.0 2 NaN 3 201.0 4 203.0 5 207.0 6 NaN 7 213.0 8 215.0 Out: 0 False 1 False 2 True 3 False 4 False 5 False 6 True 7 False 8 False
看一下该列,咱们能够看到Pandas
在空白处填充了“ NA
”。使用该方法,咱们能够确认缺失值和“ NA
”都被识别为缺失值。两个布尔响应均为。isnull()
和True
这是一个简单的示例,但强调了一个重点。Pandas
会将空单元格和“ NA
”类型都识别为缺失值。 下面,我将介绍一些Pandas
没法识别的类型。
有时多是缺乏具备不一样格式的值的状况。
让咱们看一下“Number of Bedrooms
”一栏,了解个人意思。
在此列中,有四个缺失值。
从上面中,咱们知道Pandas
会将“ NA
”识别为缺失值,但其余的状况呢?让咱们来看看。
# 看NUM_BEDROOMS这一栏 print df['NUM_BEDROOMS'] print df['NUM_BEDROOMS'].isnull()
Out: 0 3 1 3 2 n/a 3 1 4 3 5 NaN 6 2 7 -- 8 na Out: 0 False 1 False 2 False 3 False 4 False 5 True 6 False 7 False 8 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.0 1 3.0 2 NaN 3 1.0 4 3.0 5 NaN 6 2.0 7 NaN 8 NaN Out: 0 False 1 False 2 True 3 False 4 False 5 True 6 False 7 True 8 True
下面中,咱们将介绍一种更复杂但很常见的缺失值类型。
到目前为止,咱们已经看到了标准缺失值和非标准缺失值。若是咱们出现意外类型怎么办?
例如,若是咱们的功能应该是字符串,可是有数字类型,那么从技术上讲,这也是一个缺失值。
让咱们看一下“Owner Occupied
**”一栏,看看我在说什么。
从前面的示例中,咱们知道Pandas
将检测到第7行中的空单元格为缺失值。让咱们用一些代码进行确认。
# 查看OWN_OCCUPIED列 print df['OWN_OCCUPIED'] print df['OWN_OCCUPIED'].isnull()
# 查看OWN_OCCUPIED列 Out: 0 Y 1 N 2 N 3 12 4 Y 5 Y 6 NaN 7 Y 8 Y Out: 0 False 1 False 2 False 3 False 4 False 5 False 6 True 7 False 8 False
在第四行中,数字为12。Owner Occupied
的响应显然应该是字符串(Y或N)
,所以此数字类型应为缺失值。
这个示例稍微复杂一点,所以咱们须要考虑一种策略来检测这些类型的缺失值。有不少不一样的方法,可是这是我要经过这种方法工做的方式。
看一下代码,而后我将对其进行详细介绍
# 检测数据 cnt=0 for 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
将继续。
您会注意到我使用try
和except ValueError
。这称为异常处理,咱们使用它来处理错误。
若是咱们尝试将一个条目更改成一个整数而且没法更改,则将ValueError返回a
,而且代码将中止。为了解决这个问题,咱们使用异常处理来识别这些错误,并继续进行下去。
代码的另外一个重要部分是.loc
方法。这是用于修改现有条目的首选Pandas方法。有关此的更多信息,请查看Pandas
文档。
如今,咱们已经研究了检测缺失值的不一样方法,下面将概述和替换它们。
清除缺失的值后,咱们可能要对它们进行汇总。例如,咱们可能要查看每一个功能的缺失值总数。
# Total missing values for each feature print df.isnull().sum()
Out: ST_NUM 2 ST_NAME 0 OWN_OCCUPIED 2 NUM_BEDROOMS 4
在更多的时候,咱们可能须要进行快速检查,以查看是否根本缺乏任何值。
# Any missing values? print df.isnull().values.any()
Out: True
咱们可能还但愿得到缺失值的总数。
# Total number of missing values print 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)