《利用python进行数据分析》读书笔记之处理缺失值


pandas使用NaN来表示一个缺失值,常用的处理缺失值的方法如下表所示:

方法名描述
dropna根据每个标签的值是否是缺失数据来删选标签,并根据允许丢失的数据来确定阈值
fillna用某些值填充确实的数据或使用插值方法(如’ffill’或者’bfill’)
isnull返回表明哪些值是缺失值的布尔值
notnullisnull的反函数

过滤缺失值

在Series对象上使用dropna,他会返回所有Series中所有的非空数据的索引值和数据:

import pandas as pd
import numpy as np

data = pd.Series([1,np.nan,3.5,np.nan,7])
print(data.dropna())
# 0    1.0
# 2    3.5
# 4    7.0
# dtype: float64

上面例子与下面的代码是等价的:

print(data[data.notnull()])
# 0    1.0
# 2    3.5
# 4    7.0
# dtype: float64

对于DataFrame对象时,情况更加的复杂,默认情况下会删除所有含有NA的行:

import pandas as pd
import numpy as np

data = pd.DataFrame([[1.,6.5,3.],
                     [1.,np.nan,np.nan],
                     [np.nan,np.nan,np.nan],
                     [np.nan,6.5,3.]])
#      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
print(data.dropna())
#      0    1    2
# 0  1.0  6.5  3.0

如果我们想要删除全部为NA的行,可以给how传入参数’all’,另外这些默认都是在行上操作,如果想要在列上操作可以给axis传入参数1。

data = pd.DataFrame([[1.,6.5,3.],
                     [1.,np.nan,np.nan],
                     [np.nan,np.nan,np.nan],
                     [np.nan,6.5,3.]])
#      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
print(data.dropna(how = 'all'))
#      0    1    2
# 0  1.0  6.5  3.0
# 1  1.0  NaN  NaN
# 3  NaN  6.5  3.0

补全缺失值

考虑下面这个包含缺失值的DataFrame对象:

import pandas as pd
import numpy as np

data = pd.DataFrame(np.random.randn(7,3))
data.iloc[:4,1] = np.nan
data.iloc[:2,2] = np.nan
#           0         1         2
# 0 -0.072331       NaN       NaN
# 1 -1.596287       NaN       NaN
# 2  0.950330       NaN -0.002753
# 3  0.227687       NaN -0.228016
# 4  0.042131 -0.719615  1.295825
# 5  0.596739  1.588701  0.845976
# 6  0.890519 -0.465843  0.164021

注意这里由于是随机数,所以每次的数据都不相同,但是数据的格式是相同的
我们可以使用fillna方法来用一个常数来替代缺失值:

print(data.fillna(0))
#这里返回的是一个副本,原对象中的数据并没有被改变
#           0         1         2
# 0 -2.017525  0.000000  0.000000
# 1 -0.142459  0.000000  0.000000
# 2 -2.001928  0.000000 -0.440720
# 3  1.928307  0.000000  0.269469
# 4 -0.747886 -1.483791 -0.198336
# 5  0.414365 -1.883959  0.204831
# 6  2.357685 -0.735976 -0.798099

如果想要修改原对象,而不是得到一个副本,则可以给inplace传入参数True。
我们也可以使用字典的形式来将每一列的NA替换为不同的常数:

data.fillna({1:0.5,2:0},inplace = True)
print(data)
#原对象已经被修改
#           0         1         2
# 0  1.661570  0.500000  0.000000
# 1  0.446455  0.500000  0.000000
# 2 -1.684472  0.500000  0.519021
# 3  0.642737  0.500000  0.401927
# 4 -0.101460  0.434458  0.287766
# 5  0.320656  1.112652  1.852834
# 6 -0.357686 -0.190334 -1.084548

我们也可以在fillna()传入ffill和bfill完成向前填充或者向后填充:

print(data.fillna(method = 'bfill'))
#           0         1         2
# 0 -0.456311 -1.678866 -1.120995
# 1 -0.377843 -1.678866 -1.120995
# 2 -2.435059 -1.678866 -1.120995
# 3  1.787374 -1.678866 -1.645407
# 4 -2.835691 -1.678866  0.536628
# 5 -0.213191  0.598281  0.669054
# 6 -0.080384  0.622724  0.340176

我们也可以使用每列的平均值进行填充NA:

print(data.fillna(data.mean()))
#           0         1         2
# 0  0.803478 -0.255431  0.282753
# 1 -0.778492 -0.255431  0.282753
# 2 -0.226381 -0.255431  1.274111
# 3 -0.596525 -0.255431  0.448353
# 4 -0.677850 -0.721738  0.576947
# 5 -1.133373  0.257184  0.168928
# 6 -0.862804 -0.301738 -1.054576

以下是fillna的可选参数的参考:

参数描述
value标量值或字典型对象用于填充缺失值
method插值方法,如果没有其他参数,默认是’ffill’
axis需要填充的值,默认是axis = 0
inplace默认为False,此时返回的是原对象的一个备份,如果设置为True则会修改原对象
limit用于向前或者向后填充最大的填充范围
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值