方法名 | 描述 |
---|---|
dropna | 根据每个标签的值是否是缺失数据来删选标签,并根据允许丢失的数据来确定阈值 |
fillna | 用某些值填充确实的数据或使用插值方法(如’ffill’或者’bfill’) |
isnull | 返回表明哪些值是缺失值的布尔值 |
notnull | isnull的反函数 |
在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 | 用于向前或者向后填充最大的填充范围 |