Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

现实生活中的数据经常存在缺失值。产生缺失值的原因有很多,如观察资料未被记录、数据损坏等。由于很多机器学习算法不支持存在缺失值的数据集,正确处理缺失值就显得比较重要了。本文向大家介绍一些使用Python处理数据集中缺失值的方法,旨在帮助大家了解以下内容:

1、如何将数据集中无效或损坏的值标记为缺失值;

2、如何删除数据集中的缺失值;

3、如何通过均值估算数据集中存在的缺失值。

注意:运行本文的示例代码前,请确保已经安装Python2或者Python3,并安装好了Pandas, NumPy和Scikit-Learn,另外Scikit-Learn需要0.18及以上版本。

概览

本文分为以下六个部分的内容:

1、皮马印第安人糖尿病数据集(Pima Indians Diabetes Dataset)--该部分将介绍给大家一个已知存在缺失值的数据集

2、标记缺失值--该部分用来学习如何标记数据集中的缺失值

3、缺失值可能会带来的问题--该部分将了解到当数据集中存在缺失值时会对机器学习算法存在怎样的负面影响

4、删除存在缺失值的行--该部分介绍如何删除数据集中包含缺失值的行

5、估算缺失值--该部分介绍如何使用估算值来替换缺失值

6、支持存在缺失值数据集的一些算法--该部分将了解到一些支持缺失值的算法

首先,先来认识下我们的样例数据集。

1、皮马印第安人糖尿病数据集(Pima Indians Diabetes Dataset)

皮马印第安人糖尿病数据集涉及基于给定的医疗措施预测皮马印第安人5年内糖尿病的发病情况。这是一个二分类问题,每一类对应的观测值数量并不均衡。该数据集共有768组观测值,每组观测值有8个输入变量和1个输出变量。变量名称及含义如下所示:0列为怀孕次数;

1列为口服葡萄糖耐量试验中2小时后的血浆葡萄糖浓度;

2列为舒张压(单位:mm Hg)

3列为三头肌皮褶厚度(单位:mm)

4列为餐后血清胰岛素(单位:mm)

5列为体重指数(体重(公斤)/ 身高(米)^2)

6列为糖尿病家系作用

7列为年龄

8列为分类变量(0或1)

多数情况下,预测模型的基准水平大约为65%的分辨精度,最高则能达到接近77%的分类精度。

数据集的前五组观测值如下所示:

该数据集已知存在缺失值,某些列中存在的缺失值被标记为0。通过这些列中指标的定义和相应领域的常识可以证实上述观点,譬如体重指数和血压两列中的0作为指标数值来说是无意义的。

点击此处下载数据集到你的当前工作路径,并重命名为pima-indians-diabetes.csv。

2、标记缺失值

在这一部分,我们将学习如何鉴别和标记缺失值。

借助散点图和统计指标,我们能够识别缺失或损坏的数据。

如下图所示,先将数据加载到Pandas模块提供的DataFrame中,然后打印出每个变量的统计信息。

运行上述代码将产生以下结果:

这个结果非常有用:从结果中我们可以看到很多列的最小值为0。而在一些特定列代表的变量中,0值并没有意义,这就表名该值无效或为缺失值。

具体来说,下列变量的最小值为0时数据无意义:1、血浆葡萄糖浓度

2、舒张压

3、肱三头肌皮褶厚度

4、餐后血清胰岛素

5、体重指数

让我们确认一下原始数据,下述代码打印了数据集的前二十条数据。

代码运行后,可以很清楚得看到第2、3、4、5列的0值。

输出结果容易看出上述几列中每一列缺失值的个数。我们可以把DataFrame中感兴趣的包含0值的那部分子集标记为True,然后计算出对应列中值为True的数量。

上述代码的运行结果如下:

结果显示,第1、2、5列中0值较少;相比较而言,第3、4列中的0值多出数倍,接近总量的一半。

值得注意的是,为了确保有足够的数据量来训练模型,针对不同的列需要有不同的缺失值判断策略。

在Python中,尤其Pandas、Numpy、Scikit-Learn模块中,我们用NaN来标记缺失值。值为NaN的数据均不参与如求和、计数类的运算。

在Pandas的DataFrame中,通过replace()函数可以很方便的将我们感兴趣的数据子集的值标记为NaN。

标记完缺失值之后,可以利用isnull()函数将数据集中所有的NaN值标记为True,然后就可以得到每一列中缺失值的数量了。

上述代码打印了每一列中的缺失值。结果显示,第1-5列中标记后的缺失值的数量和之前打印的0值的数量相等,这表明我们已经正确识别了缺失值。

这是一个很有用的概要。不过为了确保数据准确,我们通常还是会浏览一下原数据。

以下是代码示例,这里只打印了前二十条数据。

以上代码运行后,我们可以很清楚地看到第2、3、4、5列的NaN值。由于第一列中只有5个缺失值,所以在前二十列中看不到值为NaN的情况也挺正常。

从原数据中可以很清楚地看到,对缺失值进行标记达到了预期的效果。

在开始着手处理缺失值之前,让我们先来演示下存在缺失值的数据集将会带来什么问题。

3、缺失值带来的问题

在一些机器学习算法中使用存在缺失值的数据集将会产生运行错误。

在本节中,我们将尝试评估带有缺失值的数据对线性判别分析(LDA)算法的影响。当数据集存在缺失值时,该算法将停止工作。

以下的代码用上一部分的方法标记了数据集中的缺失值,然后尝试用3倍交叉验证来求LDA算法的值并打印其平均精度。

正如所料,代码运行过程中产生了如下错误:

在有缺失值的数据集上应用LDA算法(以及其他算法)求值的过程中我们碰到了问题。接下来,我们开始学习处理缺失值的方法。

4、删除存在缺失值的行

处理缺失值最简单的策略是删除存在缺失值的记录。通过创建一个删除缺失值后的新的Pandas数据框可以实现以上效果。Pandas的dropna()函数可以用来删除存在缺失值的行或列。如下所示,利用dropna()函数我们可以删除所有存在缺失值的行。

上述代码运行后,由于所有存在NaN值的行全部被删除了,可以看到数据集的行数由原来的768大幅减少到392。

经过处理后的数据集已经可以应用到LDA这类对缺失值比较敏感的算法上来。

代码运行成功后会打印模型的预测精度。

删除存在缺失值的行对部分预测模型来说存在诸多局限性,另一种方法是估算缺失值。

5、估算缺失值

估算是指利用模型计算的结果来替代缺失值。

在进行缺失值替换时我们有很多选择,例如:在域内具有含义且不同于所有其他值的一个常量,例如0

使用另一条随机选取的记录中的对应值

该列的均值、中值或者众数

由另一个预测模型估算的值

对于训练数据及进行的任何估算,必须在将来使用最终确定的模型进行预测时,对新的数据集执行相同的操作。

例如,如果你选择使用列的均值进行缺失值估算,这些列的均值需要保存在文件中供将来存在缺失值的线数据集使用。

Pandas提供了fillna()函数来实现用特定值来替换缺失值。

如下所示,通过fillna()函数我们用每列的均值替换了该列中的缺失值。

代码的最后一行打印了每一列中的缺失值数量,结果显示经过处理已经不存在缺失值了。

scikit-learn库提供了Imputer()预处理类用来替换缺失值。

Impuer是一个很灵活的类,既可以用除了NaN之外的特定值替换缺失值,也可以指定固定的运算结果(如均值、中值、众数)来进行替换。Imputer类直接在NumPy的数组上进行运算而不是Pandas的DataFrame。

下面的代码利用Imputer类使用每一列的均值对缺失值进行了替换,并打印了转置矩阵中NaN值的数量。

运行结果显示所有的NaN值均被成功替换。

使用上述两个方法的任意一种,我们都可以对转化后的数据集中使用对NaN值敏感的算法进行训练,如前面提到的LDA。

下述代码显示了在使用估算方法转换后的数据集上训练LDA算法的过程。

运行结果打印出了使用转换后数据集训练得出的LDA模型的平均精度。

尝试用其他数值来替换缺失值,然后看一下是否能够提升模型的预测精度。

在某些情景中,数据集的缺失值具有一定的意义。下一部分将会学习一些在建模过程中将缺失值作为“值”来处理的一些算法的运用。

6、支持存在缺失值数据集的一些算法

当数据集中存在缺失值时,并不是所有算法都会失效。

有一些算法对缺失值的处理比较灵活,例如K最近邻分类算法(k-Nearest Neighbors)遇到缺失值时,可以将其不计入距离测量。

另外还有一类算法在建立训练模型时会将数据集中的缺失值作为唯一的数值来处理,例如分类和回归树算法。

不幸的是,尽管已经在考虑当中,scikit-learn模块中决策树和K最近邻分类算法的应用中对缺失值的处理并不够健壮。

即便如此,如果你准备使用诸如xgboost之类的其他算法实现或者开发自己的算法,这仍然是一个选择。

扩展阅读

总结

在本教程中,你学习了如何处理机器中存在缺失值的数据集。

具体来说,你学到了:如何将数据集中的缺失值标记为numpy的NaN值

如何删除数据集中存在缺失值的行

如何使用有意义的数值替代数据集中的缺失值英文原文:http://machinelearningmastery.com/handle-missing-data-python/

译者:mrwoody

python处理csv文件缺失值_用Python处理数据集中的缺失值相关推荐

  1. python将csv文件拆分_在python中将一个csv拆分为多个文件

    我在python中有一个约5000行的csv文件,我想将其拆分为五个文件. 我为此写了一个代码,但是没有用 import codecs import csv NO_OF_LINES_PER_FILE ...

  2. python处理csv文件案例_让繁琐的工作自动化——python处理CSV文件

    让繁琐的工作自动化--python处理CSV文件 CSV:CSV文件是一种简化的电子表格,不同于Excle(二进制文件),CSV是纯文本文件. 1.环境 python3.8 pycharm2020.1 ...

  3. python统计csv行数_对Python 多线程统计所有csv文件的行数方法详解

    如下所示: #统计某文件夹下的所有csv文件的行数(多线程) import threading import csv import os class MyThreadLine(threading.Th ...

  4. python加载csv文件去重_用python读写和处理csv文件

    读取 这里我们使用pandas包来读取csv文件,pandas处理csv文件十分方便,是我认为是目前最方便的读取方式. 首先安装pandas pip install pandas 安装好了之后我们读取 ...

  5. python计算csv列平均值_利用Python读取CSV文件并计算某一列的均值和方差

    近日需要对excel的csv文件进行处理,求取某银行历年股价的均值方差等一系列数据 文件的构成很简单,部分如下所示 总共有接近七千行数据,主要的工作就是将其中的股价数据提取出来,放入一个数组之中,然后 ...

  6. python读取csv求平均数_利用Python读取CSV文件并计算某一列的均值和方差

    近日需要对excel的csv文件进行处理,求取某银行历年股价的均值方差等一系列数据 文件的构成很简单,部分如下所示 总共有接近七千行数据,主要的工作就是将其中的股价数据提取出来,放入一个数组之中,然后 ...

  7. python交互式和文件式_使用Python创建和自动化交互式仪表盘

    python交互式和文件式 In this tutorial, I will be creating an automated, interactive dashboard of Texas COVI ...

  8. python输出csv文件-更高效的Python CSV文件导出

    image 在上一篇文章,我介绍了CSV是什么?CSV有哪些优点?如何使用等等?并且最后我们用一个例子简单讲解了如何使用Python模块CSV进行导出后缀为.csv的文本文件. 其实例子用于异步导出数 ...

  9. python读取csv某些行_【Python】Python 读取csv的某行或某列数据

    站长用Python写了一个可以提取csv任一列的代码,欢迎使用. Github链接 csv是Comma-Separated Values的缩写,是用文本文件形式储存的表格数据,比如如下的表格: 就可以 ...

  10. python操作csv文件第7行开始的数据_Python教程-Python读写CSV文件

    前言 本教程学习在Python中使用CSV文件.CSV(逗号分隔值)格式是在电子表格和数据库中使用的非常流行的导入和导出格式.Python语言包含该模块,该模块具有用于读取和写入CSV格式的数据的类. ...

最新文章

  1. IOS_多线程_ASI_AFN_UIWebView
  2. 第六天 选择与循环语句
  3. Redis之GEO存储地理位置信息
  4. 关于UAC执行级别的研究
  5. why my cloudDatabaseconfig bean Initialization failed
  6. UILabel 详解
  7. 前端学习(2328):angular之模板
  8. 正则表达式 使用分支
  9. 【最佳实践】【Blend】Triggers、Actions 和 Behaviors
  10. PHP 接口中echo die和return的区别
  11. 2018年度中国LC3盛大召开!
  12. Java的8种基本数据类型
  13. 附032.Kubernetes实现蓝绿发布
  14. Python核心编程 课后习题 第一部分
  15. 好用的图形工具yEd Graph Editor
  16. vmware虚拟机linux重置密码
  17. 欧姆龙plc编程软件CX-Progammer v9.8升级教程
  18. java arraylist 求和_java-ArrayList中类对象属性的总和
  19. 如何做好积分商城运营?
  20. 数据库中超码、候选码、主码的理解

热门文章

  1. C++数据采集软件和数据显示软件(TCP通信)
  2. AutoLeaders控制组——C51单片机学习笔记--定时器串口通信LED点阵屏
  3. 新手焊接电路板_手把手教您如何掌握焊接电路板基础知识
  4. Excel多条件计数——COUNTIFS【获奖情况统计】
  5. 详解:分治算法【Java实现】——汉诺塔问题
  6. 获取小程序码所携带的参数
  7. 如何删除搜索框的搜索记录(谷歌浏览器)
  8. 笔记本使用HDMI连接显示器没反应
  9. 鸡啄米C++编程入门教程系列
  10. 一、物流的基本概念|1.2现代物流管理的形成和发展