1、前记
pandas对象上的所有描述统计都排除了缺失数据,使用浮点值NaN表示浮点和非浮点数组中的缺失数据。
string_data = Series(['aa','ar',np.nan,'avo'])
string_data
Out[27]:
0 aa
1 ar
2 NaN
3 avo
dtype: object
string_data.isnull()
Out[28]:
0 False
1 False
2 True
3 False
dtype: bool
string_data[0]=None
string_data.isnull()
Out[30]:
0 True
1 False
2 True
3 False
dtype: bool
dropna | 根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度 |
fillna | 用指定值或插值方法(如ffill或bfill)填充缺失数据 |
isnull | 返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值/NA,该对象的类型与源类型一样 |
notnull | isnull的否定式 |
2、滤除缺失数据
(1)对于一个Series,dropna返回一个仅含非空数据和索引值的Series:
from numpy import nan as NA
data = Series([1,NA,3.5,NA,7])
data.dropna()
Out[33]:
0 1.0
2 3.5
4 7.0
dtype: float64
当然,也可以通过布尔型索引达到这个目的:
data[data.notnull()]
Out[34]:
0 1.0
2 3.5
4 7.0
dtype: float64
(2)对于DataFrame对象
①dropna默认丢弃任何含有缺失值的行:
data = DataFrame([[1,6.5,3.],[1.,NA,NA],[NA,NA,NA],[NA,6.5,3.]])
cleaned = data.dropna()
data
Out[37]:
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
Out[38]:
0 1 2
0 1.0 6.5 3.0
②传入how='all'将只丢弃全为NA的那些行:
data.dropna(how='all')
Out[39]:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
3 NaN 6.5 3.0
用这种方式丢弃列的话,只需传入axis=1即可
data.dropna(how='all',axis=1)
Out[40]:
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
另一个滤除DataFrame行的问题涉及时间序列数据。假设只想留下一部分观测数据,可以用thresh参数实现此目的:
但是,下面这个iloc和loc是不是错了?效果咋是一样的?我很迷,有没有知道的,感激!
df = DataFrame(np.random.randn(7,3))
from numpy import nan as NA
df.iloc[:4,1] = NA
df.loc[:3,2] = NA
df
Out[8]:
0 1 2
0 -2.392721 NaN NaN
1 0.218175 NaN NaN
2 -0.551001 NaN NaN
3 -1.193819 NaN NaN
4 0.251430 NaN 0.165344
5 0.353838 -1.473924 0.120994
6 -1.881549 -2.605414 0.091505
df.dropna(thresh=3)
Out[9]:
0 1 2
5 0.353838 -1.473924 0.120994
6 -1.881549 -2.605414 0.091505
3、填充缺失数据
df.fillna(0)
Out[48]:
0 1 2
0 -0.736398 0.00000 0.000000
1 0.733540 0.00000 0.000000
2 -1.894173 0.00000 0.000000
3 -1.195053 0.00000 0.000000
4 -0.022654 0.00000 0.414124
5 -0.468519 0.00000 -0.176802
6 1.326602 2.33336 0.136677
若是通过一个字典调用fillna,就可以实现对不同的列填充不同的值:
df.fillna({1:0.5,3:-1})
Out[49]:
0 1 2
0 -0.736398 0.50000 NaN
1 0.733540 0.50000 NaN
2 -1.894173 0.50000 NaN
3 -1.195053 0.50000 NaN
4 -0.022654 0.50000 0.414124
5 -0.468519 0.50000 -0.176802
6 1.326602 2.33336 0.136677
fillna默认会返回新对象,但也可以对现有对象进行就地修改:
_=df.fillna(0,inplace=True)
df
Out[51]:
0 1 2
0 -0.736398 0.00000 0.000000
1 0.733540 0.00000 0.000000
2 -1.894173 0.00000 0.000000
3 -1.195053 0.00000 0.000000
4 -0.022654 0.00000 0.414124
5 -0.468519 0.00000 -0.176802
6 1.326602 2.33336 0.136677
对reindex有效的那些插值方法也可用于fillna:
ff.fillna(method='ffill')
df.fillna(method='ffill',limit=2)
传入Series的平均值或中位数:
data = Series([1.,Na,3.5,NA,7])
data.fillna(data.mean())
value | 用于填充缺失值的标量值或字典对象 |
method | 插值方式。如果函数调用时未指定其他参数的话,默认为“ffill” |
axis | 待填充的轴,默认axis=0 |
inplace | 修改调用者对象而不产生副本 |
limit | (对于前向和后向填充)可以连续填充的最大数量 |