共计 3881 个字符,预计需要花费 10 分钟才能阅读完成。
获取文中的
CSV
文件 用于代码编程 以及文章首发地址,请点击下方超链接
获取 CSV,用于编程调试请点这
在本文中,咱们将应用 Python
的Pandas
库逐渐实现许多不同的数据清理工作。具体而言,咱们将重点关注可能是最大的数据清理工作,即 短少值。
缺失值的起源
在深入研究代码之前,理解失落数据的起源很重要。这是数据失落的一些典型起因:
- 用户遗记填写字段。
- 从旧版数据库手动传输时,数据失落。
- 产生编程谬误。
- 用户抉择不填写字段。
其中一些起源只是简略的随机谬误。在其余时候,可能会有更深层的起因导致数据失落。
筹备工作
在开始清理数据集之前,最好先大抵理解一下数据。
- 有哪些性能?
- 预期的类型是什么(
int,float,string,boolean
)? - 是否有显著的缺失数据(熊猫能够检测到的值)?
- 是否还有其余类型的失落数据不太显著(无奈通过 Pandas 轻松检测到)?
了阐明我的意思,让咱们开始钻研示例。
咱们要应用的数据是十分小的房地产数据集。获取 CSV
文件。你能够单击此处获取, 以便能够进行编码。
疾速浏览一下数据:
疾速理解数据的一种好办法是查看前几行。在 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
”一栏,理解我的意思。
在此列中,有四个缺失值。
- n/a
- NA
- —
- na
从下面中,咱们晓得 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)
,因而此 数字类型应为缺失值。
这个示例略微简单一点,因而咱们须要思考一种策略来检测这些类型的缺失值。有很多不同的办法,然而这是我要通过这种办法工作的形式。
- 遍历 OWN_OCCUPIED 列
- 尝试将条目转换为整数
- 如果条目能够更改为整数,请输出缺失值
- 如果数字不能是整数,咱们晓得它是一个字符串,所以持续
看一下代码,而后我将对其进行具体介绍
# 检测数据
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)