Task01:缺失数据

对于缺失值的处理,从总体上来说分为删除存在缺失值的个案和缺失值插补。对于主观数据,人将影响数据的真实性,存在缺失值的样本的其他属性的真实值不能保证,那么依赖于这些属性值的插补也是不可靠的,
所以对于主观数据一般不推荐插补的方法。插补主要是针对客观数据,它的可靠性有保证。

1
2
3
4
import pandas as pd
import numpy as np
df = pd.read_csv('data/table_missing.csv')
df.head()

了解缺失信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
##isna和notna方法
#对Series使用会返回布尔列表
df['Physics'].isna()
df['Physics'].notna()
#对DataFrame使用会返回布尔表
df.isna()
#但对于DataFrame我们更关心到底每列有多少缺失值
df.isna().sum()
#查看缺失数据
df.info()
#挑出某列缺失值所在行
df[df['Physics'].isna()]
#挑出所有无缺失值列
df[df.notna().all(1)]

三种缺失符号

np.nan:它不等于任何东西甚至是它自己,在用equals函数比较时,自动略过两侧全是np.nan的单元格,因此结果不会影响。其次,它在numpy中的类型为浮点,由此导致数据集读入时,即使原来是整数的列,只要有缺失值就会变为浮点型
此外,对于布尔类型的列表,如果是np.nan填充,那么它的值会自动变为True而不是False。但当修改一个布尔列表时,会改变列表类型,而不是赋值为True。在所有的表格读取后,无论列是存放什么类型的数据,默认的缺失值全为np.nan类型
因此整型列转为浮点;而字符由于无法转化为浮点,因此只能归并为object类型(’O’),原来是浮点型的则类型不变。
None:None比前者稍微好些,至少它会等于自身,它的布尔值为False,修改布尔列表不会改变数据类型,在传入数值类型后,会自动变为np.nan,只有当传入object类型是保持不动,几乎可以认为,除非人工命名None,它基本不会自动出现在Pandas中。
在使用equals函数时不会被略过,因此下面的情况下返回False:

1
pd.Series([None]).equals(pd.Series([np.nan]))


NaT:NaT是针对时间序列的缺失值,是Pandas的内置类型,可以完全看做时序版本的np.nan,与自己不等,且使用equals是也会被跳过.

Nullable类型与NA符号

这是Pandas在1.0新版本中引入的重大改变,其目的就是为了(在若干版本后)解决之前出现的混乱局面,统一缺失值处理方法
“The goal of pd.NA is provide a “missing” indicator that can be used consistently across data types (instead of np.nan, None or pd.NaT depending on the data type).”——User Guide for Pandas v-1.0
官方鼓励用户使用新的数据类型和缺失类型pd.NA
Nullable整形: 对于该种类型而言,它与原来标记int上的符号区别在于首字母大写:’Int’,它的好处就在于,其中前面提到的三种缺失值都会被替换为统一的NA符号,且不改变数据类型。
Nullable布尔:对于该种类型而言,作用与上面的类似,记号为boolean,需要注意的是,含有pd.NA的布尔列表在1.0.2之前的版本作为索引时会报错,这是一个之前的bug,现已经修复。
string类型:该类型是1.0的一大创新,目的之一就是为了区分开原本含糊不清的object类型,这里将简要地提及string,因为它是第7章的主题内容它本质上也属于Nullable类型,因为并不会因为含有缺失而改变类型。

1
2
s = pd.Series(['dog','cat'],dtype='string')
s

1
2
s[0] = np.nan
s

1
2
s[0] = None
s

1
2
s[0] = pd.NaT
s


此外,和object类型的一点重要区别就在于,在调用字符方法后,string类型返回的是Nullable类型,object则会根据缺失类型和数据类型而改变。

convert_dtypes方法

这个函数的功能往往就是在读取数据时,就把数据列转为Nullable类型,是1.0的新函数。

1
pd.read_csv('data/table_missing.csv').dtypes

1
pd.read_csv('data/table_missing.csv').convert_dtypes().dtypes

缺失数据的运算与处理

使用加法时,缺失值为0,使用乘法时,缺失值为1,使用累计函数时,缺失值自动略过。groupby方法中的缺失值,自动忽略为缺失值的组:

1
2
df_g = pd.DataFrame({'one':['A','B','C','D',np.nan],'two':np.random.randn(5)})
df_g

 

1
df_g.groupby('one').groups

填充与剔除

1
2
3
4
#fillna方法
df['Physics'].fillna('missing')
df['Physics'].fillna(method='ffill')
df['Physics'].fillna(method='backfill')

填充中的对齐特性:

1
2
df_f = pd.DataFrame({'A':[1,3,np.nan],'B':[2,4,np.nan],'C':[3,5,np.nan]})
df_f.fillna(df_f.mean())

 

1
df_f.mean()[['A','B']]

1
2
#返回的结果中没有C,根据对齐特点不会被填充
df_f.fillna(df_f.mean()[['A','B']])


dropna 方法:

1
2
df_d = pd.DataFrame({'A':[np.nan,np.nan,np.nan],'B':[np.nan,3,2],'C':[3,2,1]})
df_d

1
df_d.dropna(axis=0)

 

1
df_d.dropna(axis=1)

 

1
2
#how参数(可以选all或者any,表示全为缺失去除和存在缺失去除)
df_d.dropna(axis=1,how='all')

 

1
2
#subset参数(即在某一组列范围中搜索缺失值)
df_d.dropna(axis=0,subset=['B','C'])

 

插值(interpolation)

线性插值:

1
2
3
s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])
s.interpolate()
s.interpolate().plot()


与索引有关的插值:

1
2
s.interpolate(method='index').plot()
#可以看到与上面的区别


高级插值:
此处的高级指的是与线性插值相比较,例如样条插值、多项式插值、阿基玛插值等(需要安装Scipy),方法详情请看这里
关于这部分仅给出一个官方的例子,因为插值方法是数值分析的内容,而不是Pandas中的基本知识:

1
2
3
4
5
6
ser = pd.Series(np.arange(1, 10.1, .25) ** 2 + np.random.randn(37))
missing = np.array([4, 13, 14, 15, 16, 17, 18, 20, 29])
ser[missing] = np.nan
methods = ['linear', 'quadratic', 'cubic']
df = pd.DataFrame({m: ser.interpolate(method=m) for m in methods})
df.plot()


** interpolate中的限制参数**

1
2
3
#limit表示最多插入多少个
s = pd.Series([1,np.nan,np.nan,np.nan,5])
s.interpolate(limit=2)

1
2
3
#limit_direction表示插值方向,可选forward,backward,both,默认前向
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_direction='backward')

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值