Pandas中的缺失值是指nan、None和NaT。如果需要把inf 和 -inf视为缺失值,需要设置 pandas的选项:

pandas.options.mode.use_inf_as_na = True

注意,None和None是相等的,但是缺失值和其他任何值(包括缺失值)是不相等的。

>>> None==None
True
>>> np.nan == np.nan
False

一,检测缺失值

检测缺失值的函数是isna()和notna(),在DataFrame和Series对象中也有这两个函数,这两个函数返回的结果都是布尔类型,是原始对象的掩码索引数组:

pandas.isna(obj)
pandas.notna(obj)

举个例子,创建一个ndarray数组,使用pd.isna()来检测该数组中的缺失值:

>>> array = np.array([[1, np.nan, 3], [4, 5, np.nan]])>>> pd.isna(array)
array([[False, True, False],
[False, False, True]])

二,删除缺失值

对于DataFrame而言,缺失值可能存在于某一个行的某一列中,在删除缺失值时,通常情况下,需要把一整行的数据都删除。当某一列出现的缺失值过多时,通常考录把该列整体删除。

DataFrame.dropna(self, axis=0, how='any', thresh=None, subset=None, inplace=False)

参数注释:

  • axis:轴,默认值是0,axis=0或'index'表示行,axis=1或'columns'表示列,当轴包含缺失值时,删除该轴(一行或一列)。
  • how:有效值是any和all,any表示只要行或列中出现缺失值,就删除该轴;all表示只有当行或列中的元素都是缺失值时,才删除该轴。
  • thresh:设置一行或一列中非缺失值的阈值,当大于该阈值时,该轴不会被删除。
  • subset:在subset中指定的列或行中查找缺失值
  • inplace:如果设置为True,那么替换原始的DataFrame对象,返回None。

三,填充缺失值

把出现缺失值的位置称作一个hole(空洞),当某一列中出现的缺失值较少时,可以考虑填充缺失值。

DataFrame.fillna(self, value=None, method=None, axis=None, inplace=False, limit=None, **kwargs)

参数注释:

  • value:用作填充的值
  • method:填充的方法,有效值是:‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None
  • limit:如果指定method,那么limit表示在向前或向后寻找有效值的过程中,遇到的连续NaN的最大数量,换句话说,如果空洞向前或向后存在连续的NaN数量大于该阈值,该空洞不会被填充。如果未指定method,那么limit是填充的NaN的最大数量。

填充的方法主要是回填和补填,回填(‘backfill’, ‘bfill’)是指用空洞下一个有效值来填充空洞;补填(‘pad’, ‘ffill’)是指用空洞之前的一个有效值来填充空洞。也就是说,用空洞前后的有效值来填充空洞。

举个例子,在补填缺失值时,设置一列中连续空洞的数量不要超过2个,当连续空洞的数量超过2时,只填充第一个空洞。

In [47]: df
Out[47]:
one two three
a NaN -0.282863 -1.509059
c NaN 1.212112 -0.173215
e NaN NaN NaN
f NaN NaN NaN
h NaN -0.706771 -1.039575 In [48]: df.fillna(method='pad', limit=1)
Out[48]:
one two three
a NaN -0.282863 -1.509059
c NaN 1.212112 -0.173215
e NaN 1.212112 -0.173215
f NaN NaN NaN
h NaN -0.706771 -1.039575

四,使用插补法填充缺失值

fillna()函数使用简单的方法来填充缺失值,插补法是比fillna()函数高级的填充方法。

DataFrame.interpolate(self, method='linear', axis=0, limit=None, inplace=False, limit_direction='forward', limit_area=None, **kwargs)

参数注释:

  • method:插补的方法
  • limit:表示在向前或向后寻找有效值的过程中,遇到的连续NaN的最大数量,换句话说,如果空洞向前或向后存在连续的NaN数量大于该阈值,该空洞不会被填充。
  • limit_direction :当limit指定时,有效值是‘forward’, ‘backward’, ‘both’,表示按照该方向填充连续的NaN
  • limit_area :当limit指定时,有效值是None,'inside', 'outside',None表示没有填充限制,inside表示NaN被有效值环绕,NaN在中心,有效值在外围,利用有效值向内推测有效值;outside表示有效值被Nan环绕,有效值在中心,而NaN在有效值的外围,利用有效值向外推测有效值。

插补的方法有很多,简单的插补方法有:

  • linear:线性插补,把数据值看作是等间距的,把空洞或连续空洞两端的有效值均匀分割成n+1份,n是空洞或连续空洞的数量。
  • time:按照时间间隔来填充数据,常用的时间间隔是day
  • pad:回填,利用现有的值来填充缺失值
  • 复杂的插补算法需要使用scipy包。

参考文档:

SciPy documentation

SciPy tutorial.

Working with missing data

pandas 学习 第十一篇:处理缺失值的更多相关文章

  1. 从.Net到Java学习第十一篇——SpringBoot登录实现

    从.Net到Java学习系列目录 通过前面10篇文章的学习,相信我们对SpringBoot已经有了一些了解,那么如何来验证我们的学习成果呢?当然是通过做项目来证明啦!所以从这一篇开始我将会对之前自己做 ...

  2. pandas 学习 第7篇:DataFrame - 数据处理(应用、操作索引、重命名、合并)

    DataFrame的这些操作和Series很相似,这里简单介绍一下. 一,应用和应用映射 apply()函数对每个轴应用一个函数,applymap()函数对每个元素应用一个函数: DataFrame. ...

  3. pandas 学习 第6篇:DataFrame - 数据处理(长宽格式、透视表)

    长宽格式的转换 宽格式是指:一列或多列作为标识变量(id_vars),其他变量作为度量变量(value_vars),直观上看,这种格式的数据比较宽,举个列子,列名是:id1.id2.var1.var2 ...

  4. pandas 学习 第2篇:Series -(创建,属性,转换和索引)

    序列(Series)是由一组数据(各种NumPy数据类型),以及一组与之相关的数据标签(索引)组成,序列不要求数据类型是相同的. 序列是一个一维数组,只有一个维度(或称作轴)是行(row),在访问序列 ...

  5. Pandas 学习 第9篇:DataFrame - 数据的输入输出

    常用的数据存储介质是数据库和csv文件,pandas模块包含了相应的API对数据进行输入和输出: 对于格式化的平面文件:read_table() 对于csv文件:read_csv().to_csv() ...

  6. pandas 学习 第5篇:DataFrame - 访问数据框

    数据框是用于存储数据的二维结构,分为行和列,一行和一列的交叉位置是一个cell,该cell的位置是由行索引和列索引共同确定的.可以通过at/iat,或loc/iloc属性来访问数据框的元素,该属性后跟 ...

  7. pandas 学习 第8篇:Index 对象 - (创建、转换、排序)

    Index对象负责管理轴标签.轴名称等元数据,是一个不可修改的.有序的.可以索引的ndarry对象.在构建Sereis或DataFrame时,所用到的任何数据或者array-like的标签,都会转换为 ...

  8. pandas 学习 第3篇:Series - 数据处理(应用、分组、滚动、扩展、指数加权移动平均)

    序列内置一些函数,用于循环对序列的元素执行操作. 一,应用和转换函数 应用apply 对序列的各个元素应用函数: Series.apply(self, func, convert_dtype=True ...

  9. pandas 学习 第1篇:pandas基础 - 数据结构和数据类型

    pandas是基于NumPy构建的模块,含有使数据分析更快更简单的操作工具和数据结构,是数据分析必不可少的五个包之一.pandas包含序列Series和数据框DataFrame两种最主要数据结构,索引 ...

随机推荐

  1. idea万能快捷键,不可不知的17个实用技巧

    说明 IDEA里有一个万能快捷键(alt enter),功能非常强大,同一个快捷键,可以根据不同的语境提示你不同的操作,很多人可能还不了解这些功能,在处理代码的时候还手动处理,了解这些技巧之后,你编码 ...

  2. bat 获取管理员权限,判断系统位数,获取当前文件所在目录,regsvr32注册DLL、OCX

    1.获取管理员权限 @echo off if exist "%SystemRoot%\SysWOW64" path %path%;%windir%\SysNative;%Syste ...

  3. eclipse IDE 32位汉化方法及常用软件汉化包寻找办法

    今天听说小组开发人员遇到安装eclipse不能汉化问题.了解到其他同事用的都是64位操作系统,这个同事用的32位系统.通常情况下常用软件都有各路大神发的成熟汉化包,不会出现无法安装汉化包的情况. 先找 ...

  4. Memcache内存缓存框架

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10923221.html 一:Memcache是什么,为什么要用它 MemCache是一个高性能.“分布式”的 ...

  5. DF1协议常用命令

    PCCC:Programmable Controller Communication Commands. AB PLC常用指令 根据http://www.iatips.com/pccc_tips.ht ...

  6. Linux shell awk逻辑控制语句

    awk逻辑控制语句 1,if...else 格式: if(条件){语句:语句} else {语句1:语句2} 如果statement只有一条语句,{}可以不写 以冒号为分隔符,判断第一个字段,如果为r ...

  7. 《linux就该这么学》课堂笔记15 vsftpd文件传输、Samba/NFS文件共享

    1.为了能够在如此复杂多样的设备之间(Windows.Linux.UNIX.Mac等不同的操作系统)解决问题解决文件传输问题,文件传输协议(FTP)应运而生. FTP服务器是按照FTP协议在互联网上提 ...

  8. java JSONObject

    JSONObject.has("key")方法首先判断是否含有该key字段,如果不存在该字段,返回false;如果存在此字段,还判断了该字段的value值是否为null,如果val ...

  9. 初识PIXI.js

    由于项目需要接触到PIXI这个框架,故开始了一顿打头操作 由于目前PIXI的文档还是很少,而且大多数是英文文档这里提供几个PIXI的demo和文档 demo: http://47.99.120.179 ...

  10. 【myBatis】java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.NUMBE

    可能#{current_date, jdbcType=VARCHAR}中的VARCHAR类型不对