Python—关于Pandas缺失值问题(国内惟一)

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

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

在本文中,咱们将使用PythonPandas库逐步完成许多不一样的数据清理任务。具体而言,咱们将重点关注多是最大的数据清理任务,即 缺乏值。编程

缺失值的来源

在深刻研究代码以前,了解丢失数据的来源很重要。这是数据丢失的一些典型缘由:编码

  • 用户忘记填写字段。
  • 从旧版数据库手动传输时,数据丢失。
  • 发生编程错误。
  • 用户选择不填写字段。

其中一些来源只是简单的随机错误。在其余时候,可能会有更深层的缘由致使数据丢失。spa

准备工做

在开始清理数据集以前,最好先大体了解一下数据。调试

  • 有哪些功能?
  • 预期的类型是什么(int,float,string,boolean)?
  • 是否有明显的缺失数据(熊猫能够检测到的值)?
  • 是否还有其余类型的丢失数据不太明显(没法经过Pandas轻松检测到)?

了说明个人意思,让咱们开始研究示例。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”一栏,了解个人意思。
在这里插入图片描述

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

  • 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将继续。

您会注意到我使用tryexcept 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)
相关文章
相关标签/搜索