缺失值与空值
**缺省值:**数据集中数值为空的值, pandas使用Nan
/ NaT
表示
**空值:**空字符串 ""
1 2 3 4
| s1 = [10, 10.5, None, 11] s2 = [7, 6.9,7.5,None] pdata = pd.DataFrame({'s1':s1, 's2':s2}) pdata
|
|
s1 |
s2 |
0 |
10.0 |
7.0 |
1 |
10.5 |
6.9 |
2 |
NaN |
7.5 |
3 |
11.0 |
NaN |
缺失值判断
判断方法:
pd.isnull()
:缺省值对应的值为True,返回值为Boolean的Series或者DataFrame对象
pd.notnull()
:缺省值对应的值为False,返回值为Boolean的Series或者DataFrame对象
pdata.isnull()
/ pdata.notnull()
:同上
1 2
| sdata = pd.Series([1,2,3, np.NaN]) pd.isnull(sdata)
|
输出:
1 2 3 4 5
| 0 False 1 False 2 False 3 True dtype: bool
|
1 2 3 4
| s1 = [10, 10.5, None, 11] s2 = [7, 6.9,7.5,None] pdata = pd.DataFrame({'s1':s1, 's2':s2}) pd.isnull(pdata)
|
|
s1 |
s2 |
0 |
False |
False |
1 |
False |
False |
2 |
True |
False |
3 |
False |
True |
判断是否有缺失值
方式1:np.all
与 pd.notnull
结合
1 2 3 4 5 6 7
| s1 = [10, 10.5, None, 11] s2 = [7, 6.9,7.5,None] pdata = pd.DataFrame({'s1':s1, 's2':s2})
np.all(pd.notnull(pdata))
|
输出:
1 2 3 4
| s1 = [10, 10.5, 11] s2 = [7, 6.9,7.5] pdata = pd.DataFrame({'s1':s1, 's2':s2}) np.all(pd.notnull(pdata))
|
输出:
方式2:np.any
与 pd.isnull
结合
1 2 3 4 5 6 7
| s1 = [10, 10.5, 11] s2 = [7, 6.9,7.5] pdata = pd.DataFrame({'s1':s1, 's2':s2})
np.any(pd.isnull(pdata))
|
输出:
缺省值处理方式
缺省值处理:
- 过滤缺省值(按行列)
- 删除缺省值(按行列)
- 填充值,填充值方式:
- 插入均值,中位数,最大值,最小值等
- 插入特殊值
- 插入前(后)值入前(后)值
缺省值过滤
举例:某两只股票1周收盘值,None表示当前停盘
需求:获取两只股票都没有停牌的数据
1 2 3 4 5
| s1 = [10, 10.5, None, 11] s2 = [7, 6.9,7.5,None] pdata = pd.DataFrame({'s1':s1, 's2':s2}) pdata
|
|
s1 |
s2 |
0 |
10.0 |
7.0 |
1 |
10.5 |
6.9 |
2 |
NaN |
7.5 |
3 |
11.0 |
NaN |
1 2 3 4
|
bindex = np.all(pdata.notnull(), axis=1) bindex
|
输出:
1 2 3 4 5
| 0 True 1 True 2 False 3 False dtype: bool
|
|
s1 |
s2 |
0 |
10.0 |
7.0 |
1 |
10.5 |
6.9 |
删除缺省值
pdata.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
主要参数:
参数 |
说明 |
axis |
0 或 ‘index’:按行操作,1 或 ‘columns’:按列操作 |
how |
根据 axis 指定操作方式,any:只要有一个 Na 就删除,all:全部为 Na 才删除 |
thresh |
指定非 Na 值的数量,非 Na 数量大于等于 thresh 时不删除 |
subset |
指定操作的列子集 |
inplace |
True:在原始数据中进行修改 |
准备数据:
1 2 3 4 5 6
| s1 = [10, 10.5, None, 11] s2 = [7, 6.9,7.5,None] s3 = [7, 6.9,7.5,7] s4 = [None, 6.9,None,7.2] pdata = pd.DataFrame({'s1':s1, 's2':s2, 's3':s3,'s4':s4}) pdata
|
|
s1 |
s2 |
s3 |
s4 |
0 |
10.0 |
7.0 |
7.0 |
NaN |
1 |
10.5 |
6.9 |
6.9 |
6.9 |
2 |
NaN |
7.5 |
7.5 |
NaN |
3 |
11.0 |
NaN |
7.0 |
7.2 |
需求:
- 删除包含缺省值的行
- 删除包含2个缺省值行
- 删除指定列包含缺省值
- 删除包含缺省值的列
|
s1 |
s2 |
s3 |
s4 |
1 |
10.5 |
6.9 |
6.9 |
6.9 |
1 2 3
|
pdata.dropna(thresh=3)
|
|
s1 |
s2 |
s3 |
s4 |
0 |
10.0 |
7.0 |
7.0 |
NaN |
1 |
10.5 |
6.9 |
6.9 |
6.9 |
3 |
11.0 |
NaN |
7.0 |
7.2 |
1 2
| pdata.dropna(subset=['s1','s4'])
|
|
s3 |
0 |
7.0 |
1 |
6.9 |
2 |
7.5 |
3 |
7.0 |
注意:
- 以上数据删除都不对原始数据进行修改
- 指定inplace为True,在原始数据中进行修改
缺失值填充
填充方法:
pdata.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
参数 |
说明 |
value |
填充值 |
method |
填充方式:{'backfill', 'bfill', 'pad', 'ffill', None} |
axis |
指定行列:0 或 'index' 表示按行,1 或 'columns' 表示按列 |
limit |
插入数量限制 |
|
s1 |
s2 |
s3 |
s4 |
0 |
10.0 |
7.0 |
7.0 |
NaN |
1 |
10.5 |
6.9 |
6.9 |
6.9 |
2 |
NaN |
7.5 |
7.5 |
NaN |
3 |
11.0 |
NaN |
7.0 |
7.2 |
需求:
- 缺省值填充固定值0
- 使用前/后面数据填充
- 使用均值填充
- 插入均值插入均值
|
s1 |
s2 |
s3 |
s4 |
0 |
10.0 |
7.0 |
7.0 |
0.0 |
1 |
10.5 |
6.9 |
6.9 |
6.9 |
2 |
0.0 |
7.5 |
7.5 |
0.0 |
3 |
11.0 |
0.0 |
7.0 |
7.2 |
1 2 3 4
| pdata.fillna(method='ffill')
pdata.ffill()
|
1 2 3 4
| pdata.fillna(method='bfill')
pdata.bfill()
|
1 2 3 4
| pdata.fillna(axis=1,method='bfill')
pdata.bfill(axis=1)
|
对于股票缺省值,我们倾向于,使用前一天数据填充缺失值
插入均值,中位数,最大值,最小值
pdata.mean/max/min/median(axis=None, skipna=None, level=None, numeric_only=None, **kwargs)
主要参数:
参数 |
说明 |
axis |
方向,0 表示按列,1 表示按行 |
skipna |
是否忽略 NaN,True 表示不计算 NaN,默认为 True |
1 2
| pdata.fillna(pdata.mean())
|
1 2
| pdata.fillna(pdata.median())
|