利用python进行数据分析之pandas处理缺失数据

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
NA处理方法
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())
fillna函数的参数
value 用于填充缺失值的标量值或字典对象
method 插值方式。如果函数调用时未指定其他参数的话,默认为“ffill”
axis 待填充的轴,默认axis=0
inplace 修改调用者对象而不产生副本
limit (对于前向和后向填充)可以连续填充的最大数量

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(数据分析与数据挖掘)