内容简介: 本篇首先介绍Pandas中的三种缺失值符号,针对其弊端介绍Nullable类型和NA符号,最后讲述了填充、剔除和插值三类缺失值处理方法。
缺失数据在数据预处理过程中非常常见,针对缺失数据Pandas有一定的解决方法,下面来简单介绍。
缺失值可以通过isna
和notna
方法来查看,返回布尔值或布尔表。用info
可以查看缺失信息。
(1) np.nan
np.nan
填充,所有值自动变为Truenp.nan
,改变表类型(2) None
np.nan
相比,至少等于自身,即None == None
结果为True
(3 )NaT
np.nan
为了解决上面三种类型带来的混乱与缺失值处理方法不统一问题,官方库在1.0后引入了Nullable类型。
它的好处就在于:前面提到的三种缺失值都会被替换为统一的NA符号,且不改变数据类型。
(a)整形Nullable
对原来的int
改为Int
s_new = pd.Series([1, 2], dtype="Int64")
s_new = pd.Series([0, 1], dtype="boolean")
(c)String类型
记号为string
,可以有效区分原本含糊不清的Object类型。
s = pd.Series(['dog','cat'],dtype='string')
这个函数的功能往往就是在读取数据时,就把数据列转为Nullable类型,是Pandas 1.0的新函数
pd.read_csv('data/table_missing.csv').dtypes
pd.read_csv('data/table_missing.csv').convert_dtypes().dtypes
df_g = pd.DataFrame({'one':['A','B','C','D',np.nan],'two':np.random.randn(5)})
df_g.groupby('one').groups
分为值填充、前后向填充(与ffill
方法和bfill
方法等价)
df = pd.read_csv('data/table_missing.csv')
# 值填充
df['Physics'].fillna('missing').head()
# 前向填充:后一个值往前填
df['Physics'].fillna(method='ffill').head()
# 后向填充:下一个值往后填
df['Physics'].fillna(method='backfill').head()
值填充中需要注意对齐特性。具体见下面例子:
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())
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())
axis
参数选择剔除方向(0: 行;1: 列)how
参数选择剔除方式(all: 全为缺失去除;any: 存在缺失去除)subset
参数搜索范围内缺失值。df_d = pd.DataFrame({'A':[np.nan,np.nan,np.nan],'B':[np.nan,3,2],'C':[3,2,1]})
df_d.dropna(axis=0,subset=['B','C'])
(1)默认情况下,interpolate会对缺失的值进行线性插值(与索引无关):
s = pd.Series([1,10,15,-5,-2,np.nan,np.nan,28])
s.interpolate().plot()
(2)method
参数中的index
和time
选项可以使插值线性地依赖索引,即插值为索引的线性函数
s.interpolate(method='index').plot()
s_t = pd.Series([0,np.nan,10]
,index=[pd.Timestamp('2012-05-01'),pd.Timestamp('2012-05-07'),pd.Timestamp('2012-06-03')])
s_t.interpolate().plot()
s_t.interpolate(method='time').plot()
与线性插值相比,高级插值方法包括了样条插值、多项式插值、阿基玛插值等(需要安装Scipy)
可以看官方文档了解
(1)limit
表示插值数的最大值
s = pd.Series([1,np.nan,np.nan,np.nan,5])
s.interpolate(limit=2)
(2)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')
(3)limit_area
表示插值区域,可选inside,outside,默认None
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_area='inside')
s = pd.Series([np.nan,np.nan,1,np.nan,np.nan,np.nan,5,np.nan,np.nan,])
s.interpolate(limit_area='outside')
如果您觉得文章对您有用,请给我点个赞吧!
您的肯定是对我最大的鼓励。