pandas处理缺失值

pandas 用 nan 表示缺失值,可以用 isnull() 检测

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])

In [4]: string_data
Out[4]: 
0     aardvark
1    artichoke
2          NaN
3      avocado
dtype: object

In [5]: string_data.isnull()
Out[5]: 
0    False
1    False
2     True
3    False
dtype: bool

内建的Python None值也被当做NA:

In [6]: string_data[0] = None

In [7]: string_data.isnull()
Out[7]: 
0     True
1    False
2     True
3    False
dtype: bool

一、Filtering Out Missing Data(过滤缺失值)
1 . pd.dropna()

In [9]: from numpy import nan as NA

In [10]: data = pd.Series([1,5,6,NA,5,NA])

In [11]: data.dropna()
Out[11]: 
0    1.0
1    5.0
2    6.0
4    5.0
dtype: float64

上面等同于

In [12]: data[data.notnull()]
Out[12]: 
0    1.0
1    5.0
2    6.0
4    5.0
dtype: float64

对于DataFrame,会复杂一些,dropna默认会删除包含有缺失值的row:

In [13]: data = pd.DataFrame([[1., 6.5, 3.], [1., NA, NA],
    ...:                      [NA, NA, NA], [NA, 6.5, 3.]])
    ...:                      

In [14]: data
Out[14]: 
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
2  NaN  NaN  NaN
3  NaN  6.5  3.0

In [15]: data.dropna()
Out[15]: 
     0    1    2
0  1.0  6.5  3.0

设定how=all只会删除那些全是NA的行:

In [16]: data.dropna(how = 'all')
Out[16]: 
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
3  NaN  6.5  3.0

删除列也一样,设置axis=1:

In [17]: data[4] = NA

In [18]: data
Out[18]: 
     0    1    2   4
0  1.0  6.5  3.0 NaN
1  1.0  NaN  NaN NaN
2  NaN  NaN  NaN NaN
3  NaN  6.5  3.0 NaN

In [19]: data.dropna(axis=1,how = 'all')
Out[19]: 
     0    1    2
0  1.0  6.5  3.0
1  1.0  NaN  NaN
2  NaN  NaN  NaN
3  NaN  6.5  3.0

thresh参数,它的作用是,比如 thresh=2,则一行中至少有两个非nan的值,否则会被删除。

In [23]: data
Out[23]: 
     0    1    2   4
0  1.0  6.5  3.0 NaN
1  1.0  NaN  NaN NaN
2  NaN  NaN  NaN NaN
3  NaN  6.5  3.0 NaN

In [24]: data.dropna(thresh = 2)
Out[24]: 
     0    1    2   4
0  1.0  6.5  3.0 NaN
3  NaN  6.5  3.0 NaN

2 Filling In Missing Data(填补缺失值)

不是删除缺失值,而是用一些数字填补。对于大部分目的,fillna是可以用的。调用fillna的时候设置好一个常用用来替换缺失值:

In [25]: data
Out[25]: 
     0    1    2   4
0  1.0  6.5  3.0 NaN
1  1.0  NaN  NaN NaN
2  NaN  NaN  NaN NaN
3  NaN  6.5  3.0 NaN

In [26]: data.fillna(0)
Out[26]: 
     0    1    2    4
0  1.0  6.5  3.0  0.0
1  1.0  0.0  0.0  0.0
2  0.0  0.0  0.0  0.0
3  0.0  6.5  3.0  0.0

给fillna传入一个dict,可以给不同列替换不同的值:

In [27]: data.fillna({1:1,2:2})
Out[27]: 
     0    1    2   4
0  1.0  6.5  3.0 NaN
1  1.0  1.0  2.0 NaN
2  NaN  1.0  2.0 NaN
3  NaN  6.5  3.0 NaN

fillna 还可以使用 method 参数
method 可以使用下面的方法
1 . pad/ffill:用前一个非缺失值去填充该缺失值
2 . backfill/bfill:用下一个非缺失值填充该缺失值

In [50]: data
Out[50]: 
     0    1    2    4
0  1.0  6.5  3.0  2.0
1  1.0  NaN  NaN  8.0
2  NaN  NaN  NaN  NaN
3  NaN  6.5  3.0  NaN

In [51]: data.fillna(method='ffill')
Out[51]: 
     0    1    2    4
0  1.0  6.5  3.0  2.0
1  1.0  6.5  3.0  8.0
2  1.0  6.5  3.0  8.0
3  1.0  6.5  3.0  8.0

可以使用limit控制填充的数量

In [52]: data.fillna(method='ffill',limit=1)
Out[52]: 
     0    1    2    4
0  1.0  6.5  3.0  2.0
1  1.0  6.5  3.0  8.0
2  1.0  NaN  NaN  8.0
3  NaN  6.5  3.0  NaN

使用fillna可以我们做一些颇有创造力的事情。比如,可以传入一个series的平均值或中位数:

In [53]: data = pd.Series([1., NA, 3.5, NA, 7])

In [54]: data.fillna(data.mean())
Out[54]: 
0    1.000000
1    3.833333
2    3.500000
3    3.833333
4    7.000000
dtype: float64

在改变DataFrame 和 Series 的操作时,会返回一个新的对象,原对象不变,如果要改变原对象,可以添加参数 inplace = True。

END。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值