查看原文
其他

利用pandas进行数据分析(三):缺失值处理

louwill 机器学习实验室 2019-04-07

     在实际的数据处理过程中,数据缺失是一种再平常不过的现象了。缺失值的存在极大的影响了我们数据分析结果的可靠性,以至于在数据建模前我们必须对缺失值进行处理。实际的缺失值处理主要包括两个部分:即识别数据集中的缺失值和如何处理缺失。 相较于 Python, R在数据缺失处理方面提供了大量的函数和包,但未免有些冗余。而 Pythonpandas的缺失处理则显得高效精炼。在 pandas中,不必去计较你的数据集中的缺失到底是随机缺失还是非随机缺失,你只需要用 pandas函数将缺失识别出来然后视数据集大小决定是删除还是插补就可以了。

缺失值的识别

     作为 pandas最初的设计目标之一,尽可能简单的处理缺失值是其一大特点。 pandas使用浮点值 NaN表示浮点和非浮点数组中的缺失数据,其意义只是为了能让pandas将其检测出为缺失值而已。 创建一个包含缺失值的 Series:

  1. import pandas as pd

  2. import numpy as np

  3. nba_data = pd.Series(['rockets','mavericks',np.nan,'spurs'])

  4. nba_data

  5. 0      rockets

  6. 1    mavericks

  7. 2          NaN

  8. 3        spurs

  9. dtype: object

     使用 isnull方法识别缺失:

  1. #识别缺失值

  2. nba_data.isnull()

  3. 0    False

  4. 1    False

  5. 2     True

  6. 3    False

  7. dtype: bool

     在 pandasNone也是会被当成缺失处理的:

  1. nba_data[0] = None

  2. nba_data.isnull()

  3. 0     True

  4. 1    False

  5. 2     True

  6. 3    False

  7. dtype: bool

剔除缺失值

     如果缺失值在数据集中只有少量数据,因而对最后的数据分析结果并无大的影响的情况下,我们大可直接将其从数据集中剔除,这是最简单快速的一种缺失数据的处理方案。 pandas提供了 dropna方法可以剔除缺失:

  1. #dropna方法剔除缺失

  2. from numpy import nan as NA

  3. data = pd.Series([1,NA,2,5,NA])

  4. data.dropna()

  5. 0    1.0

  6. 2    2.0

  7. 3    5.0

  8. dtype: float64

     当然也可以通过布尔逻辑型索引对缺失进行剔除:

  1. #也可以通过布尔型索引去除缺失

  2. data[data.notnull()]

  3. 0    1.0

  4. 2    2.0

  5. 3    5.0

  6. dtype: float64

     以上是针对 Series的缺失值剔除方法,再来看 DataFrame:

  1. #DataFrame中的缺失处理

  2. data2 = pd.DataFrame([[NA,2,3],[NA,NA,4],[5,6,7],[NA,NA,NA]])

  3. data2_cleaned = data2.dropna()

  4. data2

  5. 0    1   2

  6. 0    NaN 2.0 3.0

  7. 1    NaN NaN 4.0

  8. 2    5.0 6.0 7.0

  9. 3    NaN NaN NaN

  10. data2_cleaned

  11.    0   1   2

  12. 2    5.0 6.0 7.0

     针对 DataFrame的行列属性,我们也可以选择在指定行和列上进行缺失值剔除:

  1. #设定参数选择筛选掉全部为NA的行

  2. data2.dropna(how='all')

  3.    0   1   2

  4. 0    NaN 2.0 3.0

  5. 1    NaN NaN 4.0

  6. 2    5.0 6.0 7.0

  7. #也可以按行列对缺失进行筛选

  8. data2[4] = NA

  9. data2

  10.    0   1   2   4

  11. 0    NaN 2.0 3.0 NaN

  12. 1    NaN NaN 4.0 NaN

  13. 2    5.0 6.0 7.0 NaN

  14. 3    NaN NaN NaN NaN

  15. data2.dropna(axis=1,how='all')

  16.    0   1   2

  17. 0    NaN 2.0 3.0

  18. 1    NaN NaN 4.0

  19. 2    5.0 6.0 7.0

  20. 3    NaN NaN NaN

插补缺失值

     在缺失数据较少的情形下,对缺失值直接进行剔除是没问题的,一旦数据集中数据缺失量达到很大比例,恐怕简单的数据剔除并不是一个好的办法。这时候缺失数据的插补法是一个较好的方法, pandas提供了灵活的数据插补方法。

  1. #创建一个带有缺失的DataFrame

  2. df = pd.DataFrame(np.random.randn(4,5))

  3. df.loc[:1,1] = NA

  4. df.loc[:2,3] = NA

  5. df

  6. 0    1   2   3   4

  7. 0    0.328507    NaN 1.039043    NaN -1.144255

  8. 1    1.417364    NaN 2.347842    NaN -0.746301

  9. 2    2.173780    -1.456884   1.461296    NaN -0.131479

  10. 3    1.034509    0.906970    1.602493    -0.997169   0.323702

fillna为缺失值的插补提供了灵活的处理方案:

  1. #fillna方法是pandas主要的数据插补方法

  2. #用0插补

  3. df.fillna(0)

  4. 0    1   2   3   4

  5. 0    0.328507    0.000000    1.039043    0.000000    -1.144255

  6. 1    1.417364    0.000000    2.347842    0.000000    -0.746301

  7. 2    2.173780    -1.456884   1.461296    0.000000    -0.131479

  8. 3    1.034509    0.906970    1.602493    -0.997169   0.323702

     可以使用字典进行插补:

  1. #使用字典对指定列进行插补

  2. df.fillna({1:0.5,3:-0.5})

  3. 0    1   2   3   4

  4. 0    0.328507    0.500000    1.039043    -0.500000   -1.144255

  5. 1    1.417364    0.500000    2.347842    -0.500000   -0.746301

  6. 2    2.173780    -1.456884   1.461296    -0.500000   -0.131479

  7. 3    1.034509    0.906970    1.602493    -0.997169   0.323702

     也可以自定义一些数据插补方法,比如均值插补等:

  1. #使用均值插补

  2. data3 = pd.Series([103,112,NA,121,98,NA])

  3. data3.fillna(data3.mean())

  4. 0    103.0

  5. 1    112.0

  6. 2    108.5

  7. 3    121.0

  8. 4     98.0

  9. 5    108.5

  10. dtype: float64

  11. #使用最大值插补

  12. data3.fillna(data3.max())

  13. 0    103.0

  14. 1    112.0

  15. 2    121.0

  16. 3    121.0

  17. 4     98.0

  18. 5    121.0

  19. dtype: float64

     关于 pandas数据缺失的处理内容,小编就介绍到这哪儿啦。



参考资料:

python for data analysis




往期精彩:

利用pandas进行数据分析(二):索引与层次化索引

利用pandas进行数据分析(一):Series和DataFrame数据结构

从numpy开启Python数据科学之旅

R数据处理包plyr:超越apply函数族的向量化运算

gganimate:构建R语言可视化gif动图

使用jupyter notebook搭建数据科学最佳交互式环境

R编程特性1:向量与向量化

R Markdown|可能是你数据分析报告最好的解决方案

如何写出整洁规范的R代码?是时候讨论一下代码规范性了

Python面向对象编程:数据封装、继承和多态

[译]为什么R语言是当今最值得学习的数据科学语言






一个数据科学热爱者的学习历程

长按二维码.关注数据科学家养成记






    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存