缺失值处理
现实生活中的数据是非常杂乱的,其中缺失值也是非常常见的,对于缺失值的存在可能会影响到后期的数据分析或挖掘工作,那么我们该如何处理这些缺失值呢?常用的有三大类方法,即删除法、填补法和插值法。
删除法
当数据中的某个变量大部分值都是缺失值,可以考虑删除改变量(删除列)当缺失值是随机分布的,且缺失的数量并不是很多是,也可以删除这些缺失的观测(删除行)。
替补法
对于连续型变量,如果变量的分布近似或就是正态分布的话,可以用均值替代那些缺失值;如果变量是有偏的,可以使用中位数来代替那些缺失值;对于离散型变量,我们一般用众数去替换那些存在缺失的观测。
插补法
插补法是基于蒙特卡洛模拟法,结合线性模型、广义线性模型、决策树等方法计算出来的预测值替换缺失值。
我们这里就介绍简单的删除法和替补法:
这是一组含有缺失值的序列,我们可以结合sum函数和isnull函数来检测数据中含有多少缺失值:
In [130]: sum(pd.isnull(s))
Out[130]: 9
直接删除缺失值
默认情况下,dropna会删除任何含有缺失值的行,我们再构造一个数据框试试:
返回结果表明,数据中只要含有缺失值NaN,该数据行就会被删除,如果使用参数 how='all'
,则表明只删除所有行为缺失值的观测。
补充一个对比例子:
>>> df = pd.DataFrame({'x1':[0,1,None,3,None],'x2':[None,1,None,None,4],'x3':[0,None,None,3,4]})
>>> df
x1 x2 x3
0 0.0 NaN 0.0
1 1.0 1.0 NaN
2 NaN NaN NaN
3 3.0 NaN 3.0
4 NaN 4.0 4.0
>>> df.dropna(how='all') # 只有全部列都为NaN的行被删掉
x1 x2 x3
0 0.0 NaN 0.0
1 1.0 1.0 NaN
3 3.0 NaN 3.0
4 NaN 4.0 4.0
>>> df.dropna() # 只要有一列包含NaN就会删除掉
Empty DataFrame
Columns: [x1, x2, x3]
Index: []
再补充一下,如果是想删除列,直接用 DataFrame.drop(['列名1','列名2'], axis=1)
这个语句就可以了。
再补充一下,被别人问问题的时候发现了一个新手容易犯的错误,在初始化时,如果某一个值为空,也即想初始化为NaN,注意不是填’NaN’,这样初始化的话,数据框中对应的元素就是一个字符串而不是空值,自然也就没法使用pandas库提供的缺失值处理函数了,正确的方法是初始化为None。
使用一个常量来填补缺失值
可以使用fillna函数实现简单的填补工作:
1)用0填补所有缺失值
2)采用前项填充或后向填充
补充,使用这种填充方法,如果第一行/最后一行出现缺失值,它们将不被填充。
3)使用常量填充不同的列
4)用均值或中位数填充各自的列
很显然,在使用填充法时,相对于常数填充或前项、后项填充,使用各列的众数、均值或中位数填充要更加合理一点,这也是工作中常用的一个快捷手段。