pandas的设计目标之一就是让缺失数据的处理任务尽量轻松。例如,pandas的describe统计都派出了缺失数据。
pandas使用浮点值NaN表示浮点和非浮点数组中的缺失数据。
string_data = Series(['aardvark', 'artichoke', np.nan, 'avocado'])
Python内置的None值也会被当做NA处理
string_data[0] = None
string_data.isnull()
滤出缺失数据
对于一个Series,dropna返回一个仅含非空数据和索引值的Series
from numpy import nan as NA
data = Series([1, NA, 3.5, NA, 7])
data.dropna()
0 1.0
2 3.5
4 7.0
dtype: float64
其实,也可以通过布尔型索引达到目的
data[data.notnull()]
0 1.0
2 3.5
4 7.0
dtype: float64
对于DataFrame对象,事情变得复杂,dropna默认丢弃任何含有缺失值的行
data = DataFrame([[1., 6.5, 3.], [1., NA, NA],
[NA, NA, NA], [NA, 6.5, 3.]])
data
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
cleaned = data.dropna()
cleaned
0 1 2
0 1.0 6.5 3.0
传入how=all,则丢弃全为NA的行
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
要丢弃列,需要引入axis=1
data[4] = NA
data.dropna(axis=1, how='all')
另一个滤出DataFrame行的问题涉及时间序列数据,假设只想留下一部分观测数据,可以使用thresh参数实现
df = DataFrame(np.random.randn(7, 3))
df.ix[:4, 1] = NA; df.ix[:2, 2] = NA
df
0 1 2
0 -0.577087 NaN NaN
1 0.523772 NaN NaN
2 -0.713544 NaN NaN
3 -1.860761 NaN 0.560145
4 -1.265934 NaN -1.063512
5 0.332883 -2.359419 -0.199543
6 -1.541996 -0.970736 -1.307030
df.dropna(thresh=3)
0 1 2
5 0.332883 -2.359419 -0.199543
6 -1.541996 -0.970736 -1.307030
填充缺失数据
如果是要填充数据,fillna是最主要的函数,将缺失值替换为常数值。
df.fillna(0)
若是通过一个字典调用fillna,可以实现对不同的列填充不同的值
df.fillna({1: 0.5, 3: -1})
fillna默认返回新对象,但也可以对现有对象进行修改
_ = df.fillna(0, inplace=True)
df
对reindex有效的插值方法也可以用于fillna
df = DataFrame(np.random.randn(6, 3))
df.ix[2:, 1] = NA; df.ix[4:, 2] = NA
df.fillna(method='ffill')
0 1 2
0 0.286350 0.377984 -0.753887
1 0.331286 1.349742 0.069877
2 0.246674 1.349742 1.004812
3 1.327195 1.349742 -1.549106
4 0.022185 1.349742 -1.549106
5 0.862580 1.349742 -1.549106
df.fillna(method='ffill', limit=2)
向fillna传入Series的平均值或中位数
data = Series([1., NA, 3.5, NA, 7])
data.fillna(data.mean())