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())

results matching ""

    No results matching ""