关于Pandas缺失值inf与nan的处理实践

 更新时间:2023年06月21日 15:23:26   作者:肖永威  
这篇文章主要介绍了关于Pandas缺失值inf与nan的处理实践,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

1. Pandas缺失值

对于表格数据而言,缺失值分为三种:

  • 一是Pandas中的空值(NaN)
  • 二是Pandas中的正负无穷(inf),严格意义上也不算缺失值,表示无穷!
  • 三是自定义的缺失值。

1.1. Pandas中的空值

Pandas中的空值有三个:np.nan (Not a Number) 、 None 和 pd.NaT(时间格式的空值,注意大小写不能错),这三个值可以用Pandas中的函数isnull(),notnull(),isna()进行判断。

isnull()和notnull()的结果互为取反,isnull()和isna()的结果一样。

需要特别注意三点:

1.如果某一列数据全是空值且包含pd.NaT,np.nan和None会自动转换成pd.NaT。

2.空值(np.nan、None、pd.NaT)既不是空字符串"“,也不是空格” "。

3.None是 一个 Python 对象

  • 不可以用在任意的 NumPy 或 Pandas 数组里,只用于列表且数据类型是 Object。
  • 默认 Pandas 会将 None 转换成 NAN
  • 对包含 None 元素的数组进行计算(如: sum, min, max)会抛出 TypeError 异常。
import pandas as pd
import numpy as np
df = pd.DataFrame({'float': [1.3,5.2,np.nan],
                   'int': [1,8,None],
                   'datetime': [pd.Timestamp('2018-03-10'),pd.NaT,pd.NaT],
                   'string': ['python','pandas','numpy']})

例如通过df.isnull()查看缺失情况。

1.2. Pandas中的正负无穷

对于特别大的数字,或者除数为0时,将产生正负无穷,Pandas中用np.inf表示。

import pandas as pd
import numpy as np
df = pd.DataFrame({'float': [1.3,5.2,np.nan],
                   'int': [1,8,None],
                   'datetime': [pd.Timestamp('2018-03-10'),pd.NaT,pd.NaT],
                   'string': ['python','pandas','numpy']})
df['inf'] = df['float']/0

1.3. 自定义缺失值

自定义缺失值有很多不同的形式,如上面刚说的空字符串和空格(当然,一般不用这两个,因为看起来不够直观)。

在获取数据时,可能会有一些数据无法得到,也可能数据本身就没有,造成了缺失值。

对于这些缺失值,在获取数据时通常会用一些符号之类的数据来代替,如问号?,斜杠/,字母NA等。

2. 处理缺失数据

2.1. 用数组过滤

  • 用 df.isin([np.nan, np.inf, -np.inf]) 方法
  • 用 df.any() 方法只要包含任意一个缺失的值,any()一个序列中满足一个True,则返回True
  • 最后,用 布尔数组来进行切分。
import pandas as pd
import numpy as np
df = pd.DataFrame({'float': [1.3,5.2,np.nan],
                   'int': [1,8,None],
                   'datetime': [pd.Timestamp('2018-03-10'),
                            pd.Timestamp('2019-05-10'),pd.NaT],
                   'string': ['python','pandas','numpy']})
df[~df.isin([np.nan, np.inf, -np.inf]).any(axis=1)]

2.2. 替换 inf 和 -inf 成 NaN, 然后选择非空的行数据

  • 用df.replace([np.inf, -np.inf], np.nan),把正负无穷为空值np.nan
  • 再用df.notnull(),筛选非空数据
  • 再用df.all(),all()一个序列中所有值为True时,返回True,否则为False。
import pandas as pd
import numpy as np
df = pd.DataFrame({'float': [1.3,5.2,np.inf],
                   'int': [1,8,None],
                   'datetime': [pd.Timestamp('2018-03-10'),pd.NaT,
                                pd.Timestamp('2019-05-10')],
                   'string': ['python','pandas','numpy']})
df
df['inf'] = df['float']/0
df
df['inf'].replace(np.inf, 0, inplace=True)
df
df[df.replace([np.inf, -np.inf], np.nan).notnull().all(axis=1)]
#df[df.notnull().all(axis=1)]

2.3. 替换 inf 和 -inf 成 NaN,再用dropna() 方法删除为空的数据

pandas中的dataframe对象,删除缺失值的方式:

  • df.dropna(how=‘all’) #删除所有内容均为缺失值的行
  • df.dropna(axis=1) #丢弃有缺失值的列
  • df.dropna(axis=1, how = ‘all’) #丢弃所有列中所有值均缺失的列
import pandas as pd
import numpy as np
df = pd.DataFrame({'float': [1.3,5.2,np.inf],
                   'int': [1,8,None],
                   'datetime': [pd.Timestamp('2018-03-10'),pd.NaT,
                                pd.Timestamp('2019-05-10')],
                   'string': ['python','pandas','numpy']})
df['inf'] = df['float']/0
df
df.dropna(axis=1).head(3)
df.replace([np.inf, -np.inf], np.nan).dropna(axis=1).head(3)

或者:

将某1列(series格式)中的 inf 替换为数值

import numpy as np
df['Col'][np.isinf(df['Col'])] = -1

将某1列(series格式)中的 inf 替换为NA值

import numpy as np
df['Col'][np.isinf(df['Col'])] = np.nan

2.4. 用df.fillna(value=values) 将缺失的数据进行填充

填充缺失值:

fillna(method=‘ffill'/‘bfill', # ffill向前填充;bfill向后填充。
axis=0/1 # 按行/列进行填充
)

例如:

data.fillna(0, inplace=True) # 填充0
data.fillna(method=‘ffill') # 按列,向前进行填充
data.fillna(method=‘bfill',axis=1) # 按照行,向后进行填充
data.fillna(data.mean()) # 填充平均值
import pandas as pd
import numpy as np
df = pd.DataFrame({'A':[1,np.nan],
                   'B':[21,3],
                   'C':[4,5]})
#制造inf
df['D'] = df['C']/0
print(df)
#替换正inf为NaN
df.replace(np.inf, np.nan, inplace=True)
df['E'] = -df['B']/0
print(df)
#替换正、负inf为0
df.replace([np.inf, -np.inf], 0, inplace=True)
#单列替换NaN为10
df['A'].fillna(10, inplace=True)
#替换NaN为0
df.replace(np.nan, 0, inplace=True)
print(df)

3. Pandas处理缺失值函数小结

1.isnullnotnull: 检测是否是空值,可用于dataframe和Series

2.dropna: 丢弃,删除缺失值

  • axis: 删除行还是列,{0 ro ‘index’, 1 or ‘columns’}, default 0
  • how: 如果等于any则任何值为空都删除,如果等于all则所有值都为空时才删除
  • inplace: 如果为True则修改当前dataframe, 否则返回新的dataframe

3.fillna: 填充空值

  • value: 用于填充的值,可以是单个值,或者字典(key是列名,value是值)
  • method: 等于ffill使用前一个部位空的值填充forword fill; 等于bfill使用后一个部位空的值天充backword fill
  • axis: 按行还是按列填充,{0 ro ‘index’, 1 or ‘columns’}
  • inplace: 如果为True则修改当前dataframe, 否则返回新的dataframe

4.replace: 替换,replace(to_replace, value) 前面是需要替换的值,后面是替换后的值。

  • inplace: 如果为True则修改当前dataframe, 否则返回新的dataframe

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Python的动态重新封装的教程

    Python的动态重新封装的教程

    这篇文章主要介绍了Python的动态重新封装的教程,本文来自于IBM的官方开发者文档,需要的朋友可以参考下
    2015-04-04
  • 用python给自己做一款小说阅读器过程详解

    用python给自己做一款小说阅读器过程详解

    这篇文章主要介绍了用python给自己做一款小说阅读器过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 深入浅析Django MTV模式

    深入浅析Django MTV模式

    Django是基于MTV模式的框架,需要配合url控制器(路径分发)使用,本文重点给大家介绍Django MTV模式详解,需要的朋友参考下吧
    2021-09-09
  • Python实现访问者模式详情

    Python实现访问者模式详情

    这篇文章主要介绍了Python实现访问者模式详情,访问者模式,指作用于一个对象结构体上的元素的操作。访问者可以使用户在不改变该结构体中的类的基础上定义一个新的操作,下文更多相关资料,需要的朋友可以参考下
    2022-03-03
  • 用Python爬取某乎手机APP数据

    用Python爬取某乎手机APP数据

    最近爬取的数据都是网页端,今天来教大家如何爬取手机端app数据(本文以ios苹果手机为例,其实安卓跟ios差不多)! 本文将以『某乎』为实战案例,手把手教你从配置到代码一步一步的爬取App数据,需要的朋友可以参考下
    2021-06-06
  • python实现全排列代码(回溯、深度优先搜索)

    python实现全排列代码(回溯、深度优先搜索)

    今天小编就为大家分享一篇python实现全排列代码(回溯、深度优先搜索),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python实现简单多人聊天室

    python实现简单多人聊天室

    这篇文章主要为大家详细介绍了python实现简单多人聊天室功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • IronPython连接MySQL的方法步骤

    IronPython连接MySQL的方法步骤

    这篇文章主要介绍了IronPython连接MySQL的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • python实现文件名批量替换和内容替换

    python实现文件名批量替换和内容替换

    这篇文章主要介绍了python实现文件名批量替换和内容替换,第一个例子可以指定文件类型,需要的朋友可以参考下
    2014-03-03
  • NumPy中np.c_ 和 np.r_ 的区别小结

    NumPy中np.c_ 和 np.r_ 的区别小结

    np.c_和 np.r_是NumPy库中两个非常有用的函数,它们分别用于按列和按行拼接数组本文主要介绍了NumPy中np.c_ 和 np.r_ 的区别小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02

最新评论