作者|ChangGuozhen,ZhaoRenqian,ZhangQiujian资料来源|不符合分析要求的数据,如重复、错误、缺失、异常数据。01重复值处理数据录入过程和数据整合过程中可能会产生重复数据,直接删除是重复数据处理的主要方式。Pandas提供了duplicated和drop_duplicates方法来查看和处理重复数据。以下数据为例:>sample=pd.DataFrame({'id':[1,1,1,3,4,5],'name':['Bob','Bob','Mark','Miki','Sully','Rose'],'score':[99,99,87,77,77,np.nan],'group':[1,1,1,2,1,2],})>samplegroupidnamescore011Bob99.0111Bob99.0211Mark87.0323Miki77.0414Sully77.0525RoseNaN通过duplicated方法找到重复数据,如下图,可以用这个查看重复数据的方法。>sample[sample.duplicated()]groupidnamescore111Bob99.0要删除重复项,请使用drop_duplicates方法:>sample.drop_duplicates()groupidnamescore011Bob99.0211Mark87.0323Miki77.0414Sully77.0525RoseNaNdrop_duplicates方法也可以根据某列去除重复,例如去除id列的所有重复记录:>sample.drop_duplicates('id')groupidnamescore011Bob99.0323miki77.0414Sully77.0525RoseNaN02缺失值处理缺失值是数据清洗中比较常见的问题。缺失值一般用NA表示,处理缺失值时必须遵循一定的原则。首先,你需要根据业务理解来处理缺失值,找出缺失值的原因是故意的还是随机的,然后用一些业务经验来填充。一般来说,当缺失值小于20%时,连续变量可以用均值或中位数填充;分类变量不用填,单独统计一个类别即可,也可以用众数填充分类变量。当缺失值在20%~80%之间时,填充方法同上。另外,每个有缺失值的变量都可以生成一个指标虚拟变量参与后续建模。当缺失值大于80%时,每个有缺失值的变量生成一个指标虚拟变量,参与后续建模,不使用原始变量。缺失值和缺失值指示变量的中位数插补的生成过程如下图所示。▲图5-8:缺失值填充示例Pandas提供了fillna方法来替换缺失值数据。它的功能类似于前面的replace方法。例如,对于下面的数据:>samplegroupidnamescore01.01.0Bob99.011.01.0BobNaN2NaN1.0Mark87.032.03.0Miki77.041.04.0Sully77.05NaNNaNNaNNaN如下一步步检查和填充缺失值:1.检查丢失情况。在数据分析之前,您通常需要了解缺失数据。在Python中,您可以构造一个lambda函数来查看缺失值。在这个lambda函数中,sum(col.isnull())表示当前列有多少个缺失值,col.size表示当前列总共有多少行数据:>sample.apply(lambdacol:sum(col.isnull())/col.size)group0.333333id0.166667name0.166667score0.333333dtype:float642。用指定值填充pandas数据框提供fillna方法完成缺失值的填充,比如为样本表的列score值填充缺失值,填充方法为mean:>sample.score.fillna(sample.score.mean())099.0185.0287.0377.0477.0585.0Name:score,dtype:float64当然也可以填充分位数等方法:>sample.score.fillna(sample.score.median())099.0182.0287.0377.0477.0582.0名称:分数,数据类型:float643。缺失值指示变量pandas数据框对象可以直接调用isnull方法生成缺失值指示变量,比如score变量的缺失值指示变量:>sample.score.isnull()0False1True2False3False4False5TrueName:score,dtype:bool如果要转换成值0,类型1的指示变量,可以使用apply方法,int表示将列替换成int类型>sample.score.isnull().apply(int)001120304051Name:score,dtype:int6403噪声值处理噪声值是指数据中的一个或几个值与其他值相差较大,也称为离群值、离群值(outlier)。对于大多数模型,噪声值会严重干扰模型的结果,使结论不真实或有偏差,如图5-9所示。数据预处理时需要去除所有噪声值。处理噪声值的方法有很多种。对于单变量,常用的方法有capping法和binning法;对于多变量处理,使用聚类方法。下面是详细介绍:▲图5-9:噪声值示例(离群值,离群值):年龄数据,圆圈为噪声值1.Capping方法capping方法记录3次范围外的记录将连续变量的均值的标准差替换为均值上下三个标准差的值,即封顶处理(图5-10)。▲图5-10:capping方法处理噪声值的例子capping方法可以通过Python中的用户自定义函数来完成。如下图,参数x表示一个pd.Series列,quantile指的是block的范围区间。默认情况下,所有小于1个百分位和大于99个百分位的值都会被第1个百分位数和第99个百分位替换:>defcap(x,quantile=[0.01,0.99]):"""cappingmethodtohandleoutliersargs:x:pd.Seriescolumn,continuousvariablequantile:specifycappingmethod上下分位数范围"""#生成分位数Q01,Q99=x.quantile(quantile).values.tolist()#替换异常具有指定分位数的值ifQ01>x.min():x=x.copy()x.loc[x
