写在篇前

  在数据处理实践中,数据不可能十全十美,总会由于总总原因,比如不可测、测量结果丢失等原因使得部分数据缺失,处理缺失值的策略一般分为以下两种:

  1. 通过维持一个覆盖全局的掩码表示缺失值

      a)维持一个与数据表大小相同的bool值数组

      b)用一个bit表示有缺失值的局部状态

  2. 用一个标签值(sentinel value)表示缺失值

  一般而言,不存在所谓的最佳选择,不同的编程语言和系统会选择不同的处理方式,在pandas中选用了标签的方式标示缺失值,包括浮点类型缺失值NaN、Python单体对象None。好吧,talk is cheap,show you the code.

缺失值标示方法

None标示缺失值

>>> import numpy as np
>>> vals1 = np.array([1, None, 3, 4])
>>> vals1array([1, None, 3, 4], dtype=object)# None只能用于object类型数组,这将会比原生int,float类型更加消耗资源,所以谨慎使用

NaN标示缺失值

>>> vals2 = np.array([1, np.nan, 3, 4])
>>> vals2
array([ 1., nan,  3.,  4.])
>>> vals2.dtype
dtype('float64')# 在这种方式中,将以原生类型float64作为数组类型,将具有更加好的性能
# 原因是这会被编译C代码,从而实现快速操作# 关于nan还需要注意几个问题
>>> vals2.sum()
nan
>>> np.nansum(vals2)
8.0>>> vals2.min()
nan
>>> np.nanmin(vals2)
1.0

Pandas中None与NaN的差异

   Pandas把它们看成是可以等价交换的,在适当的时候会将两者进行替换。

>>> pd.Series([1, np.nan, 2, None])
0    1.0
1    NaN
2    2.0
3    NaN
dtype: float64

缺失值处理方法

  • isnull()   创建一个布尔类型的掩码标签缺失值
  • notnull()   与 isnull() 操作相反
  • dropna()   返回一个剔除缺失值的数据
  • fillna()   返回一个填充了缺失值的数据副本

发现缺失值

>>> data = pd.Series([1, np.nan, 'hello', None])
>>> data.isnull()
0    False
1     True
2    False
3     True
dtype: bool>>> data.notnull()
0     True
1    False
2     True
3    False
dtype: bool# 应用
>>> data[data.notnull()]
0        1
2    hello
dtype: object

剔除缺失值

# 剔除缺失值,主要用dropna()函数def dropna(self, axis=0, how='any', thresh=None, subset=None,inplace=False)
# axis 标示轴向,0代表行,1代表列
# how 有选项 any、all
# thresh与 how选项互斥使用,指定一行或一列非缺失值的最小个数
# subset array-like, optional,表示只将非axis轴所指定行或列纳入剔除考虑
# inplace 表示是否要创建新的副本,个人建议为True,减少资源消耗# subset参数稍微不好理解,show u the code
df = pd.DataFrame([[1, np.nan, 2, 5],[2, 3, 5, 6],[np.nan, 4, 6, 7]
])print(df.dropna(axis=0, how='any', subset=[0, 3]))【output:】     0    1  2  3
0  1.0  NaN  2  5
1  2.0  3.0  5  6解析:在本例中,明明指定了按行剔除,只要有any缺失值就踢除改行,但是第一行却保留了,纳尼?这就是subset的作用,因为我们在subset参数中指定了是看第0、3列有没有缺失值从而决定是否剔除该列。

填充缺失值

  数据是宝贵的,有时候我们并不忍心删除一些记录,这时候我们就需要考虑用何种方式对缺失值进行修复,这就是缺失值填充。其实缺失值填充的策略非常之多,这里主要介绍Pandas内置的填充方式,具体用哪种方式,这也许真的需要具体任务具体分析。

# 函数主要参数
def fillna(self, value=None, method=None, axis=None, inplace=False)# value 表示填充特定值
# method 表示填充方式,与value互斥使用,有从后往前填充(method='ffill'),从前往后填充(method='bfill')
# axis 表示轴向,在ffill与bfill方式中有区别,注意体会
# inplace 表示是否要创建新的副本,个人建议为True,减少资源消耗# 例子
data = pd.Series([1, np.nan, 2, None, 3], index=list('abcde'))
print(data.fillna(value=0))a    1.0
b    0.0
c    2.0
d    0.0
e    3.0
dtype: float64

总结

  在这一篇中,主要总结了pandas中的缺失值处理方式,但是实际上处理缺失值的方式非常灵活,需要具体任务具体分析,甚至自定义一种处理方式。要自定义处理,就需要掌握好一些pandas数据集的处理技巧,可以参考我之前的博客pandas 数据分析常用技巧,比如其中的applyapplymapmap等方法对于定义高级数据操作极其方便、重要。

Pandas处理数据缺失值相关推荐

  1. Python中pandas库实现数据缺失值判断isnull()函数

    [小白从小学Python.C.Java] [Python全国计算机等级考试] [Python数据分析考试必会题] ● 标题与摘要 Python中pandas库实现数据缺失值判断 isnull()函数 ...

  2. python处理数据的优势-【Python数据分析基础】: 数据缺失值处理

    作者:xiaoyu 微信公众号:Python数据科学 圣人曾说过:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已. 再好的模型,如果没有好的数据和特征质量,那训练出来的效果也不会有所 ...

  3. python数据预处理案例_对pandas进行数据预处理的实例讲解

    参加kaggle数据挖掘比赛,就第一个赛题Titanic的数据,学习相关数据预处理以及模型建立,本博客关注基于pandas进行数据预处理过程.包括数据统计.数据离散化.数据关联性分析 引入包和加载数据 ...

  4. pandas 选择数据 字符串_读完本文,轻松玩转数据处理利器Pandas 1.0

    选自Medium 作者:Tom Waterman机器之心编译参与:李诗萌.魔王 2020 年 1 月 9 日 Pandas 1.0.0rc 版本面世,Facebook 数据科学家 Tom Waterm ...

  5. pandas用均值填充nan_如何填补Pandas中的缺失值(机器学习入门篇)

    在使用python里的pandas库进行数据分析工作时,很多时候我们都会遇到这样一个问题:数据缺失.这也是大部分数据分析工作所会遇到的之一.而正确处理缺失值,也是我们在数据分析中数据预处理环节的关键的 ...

  6. 3-10 Pandas的数据规整

    数据分析工具pandas 10. Pandas的数据规整 10.1 层次化索引 10.2 数据连接 10.2.1 pd.merge 10.2.2 pd.concat 10.3 重塑 10.3.1 st ...

  7. Pandas处理数据遇到的问题与解决

    前言 主要记录自己pandas处理数据遇到的一些困难,基础非常薄弱,希望能越来越熟练 Next:set_index与reindex的区别 问题描述 经常会遇到 更改index 将某一个column的信 ...

  8. Pandas之数据标准化

    Python数据分析博文汇总 Pandas重复值处理函数drop_duplicates() Pandas数据库缺失值处理函数dropna Pandas中slice函数字段抽取 python数据分析-D ...

  9. 知乎爬虫与数据分析(二)pandas+pyecharts数据可视化分析篇(上)

    注:代码完整版可移步Github--https://github.com/florakl/zhihu_spider. 知乎爬虫与数据分析(一)数据爬取篇 知乎爬虫与数据分析(三)pandas+pyec ...

最新文章

  1. rpython求随机数代码4段5个字符_如何创建一个4位数的随机数并将其存储为变量...
  2. swoole学习(一)----linux安装swoole
  3. 【推荐】会开发和懂开发的区别
  4. 用tar备份linux
  5. 开源大数据周刊-第103期
  6. android studio修改配置文件夹(.android .gradle .AndroidStudio)位置
  7. 使用Google Guava Cache进行本地缓存
  8. 除阿里、网易和字节外,杭州居然还有这么多互联网公司!
  9. OpenCv之绘图(笔记03)
  10. python变量类型字符串的内建函数使用
  11. 使用javap分析Java的字符串操作 1
  12. windows IIS的IUSR和IIS_IUSRS 2
  13. 欧姆龙PLC存储区划分小结
  14. iOS 生成证书、描述文件、打包上架Appstore详细流程
  15. 主打python-2021年度总结-展望2022年
  16. python最全的图像拼接
  17. python非线性最小二乘拟合_非线性函数的最小二乘拟合——兼论Jupyter notebook中使用公式 [原创]...
  18. Mysql各数据库引擎优缺点,以及常用表锁,行锁,页面锁(个人总结)
  19. 各种电平标准的讨论(TTL,ECL,PECL,LVDS、CMOS、CML.......)
  20. Linux中如何对虚拟机管理和恢复

热门文章

  1. kotlin学习之类委托(八)
  2. Effective Java之用实例域代替序数(三十一)
  3. 9行代码AC——L1-022 奇偶分家(10 分)(~解题报告~)
  4. python求阶乘和
  5. ArrayBlockingQueue中的方法
  6. mysql内外链接图_图解MySQL 内连接、外连接、左连接、右连接、全连接
  7. Java自带的线程池ThreadPoolExecutor详细介绍说明和实例运用
  8. vue html5模板,vue-h5-template
  9. createprocess失败代码2_极客战记[森林]:边地之叉-通关代码及讲解
  10. 消息队列mysql redis那个好_Redis作为消息队列与RabbitMQ的比较