本文暂不讨论数据类型转换、离散变量重编码、冗余信息及无意义信息处理方法,仅先从最基本数据清洗规则:重复值、缺失值、异常值处理角度入手进行讨论,其余部分内容将在后期进行说明
注:本文讨论内容基于Python语言,处理对象为常规pandas读取数据表格格式Dataframe
使用函数:dataframe.duplicated(subset=['A','B'],keep='first')
Dataframe通过调用duplicated(),返回一个长度等于记录条数的bool类型Series,Series中的值索引位置对应Dataframe行索引位置,根据keep参数不同,表现如下(非重复记录均为False):
keep取值 | 效果 |
‘first’(默认) | 第一条重复记录为False,其余重复记录为True |
‘last’ | 最后一条重复记录为False,其余重复记录为True |
False | 重复记录均为True |
duplicated()可以通过添加Dataframe列索引列表限制重复检索范围,dataframe.duplicated()无限制情况下思维上类似SQL采用:
SELECT key1,key2...keyn FROM table GROUP BY key1,key2...keyn
的方式对一个包含了n个键的表格进行筛选,dataframe.duplicated([‘检索1’,‘检索2’])则与:
SELECT key1,key2 FROM table GROUP BY key1,key2
在思维上类似,总结来说,通过dataframe.duplicated()可以实现对表格数据重复性的预览,进而决定采取怎样的措施处理重复数据
使用函数:dataframe.drop_duplicates(subset=['A','B'],keep='first',inplace=True)
通常,对于重复数据我们采用直接删除的方法进行处理,这里我们采用的dataframe.drop_duplicates()在使用上完全与duplicated()相同,参数inplace=True代表直接在原本Dataframe上进行数据删除,inplace=False代表生成副本
使用函数:dataframe.isnull()
dataframe.isnull()会返回一个和调用dataframe结构相同的bool类型dataframe,该dataframe对应位置的bool值代表该处是否为空,这种方法并不直观,我们可以通过:
dataframe.isnull().sum() #列检索空值累加
dataframe.isnull().transpose().sum() #行检索空值累加
进一步确认空值在各行各列的分布情况并采取对应的处理方法
评估缺失值的缺失情况,我们主要采取:删除缺失记录,删除缺失索引,替换和插值四种方法,这里暂不讨论插值
使用函数:DataFrme.dropna(axis=0,how=’any’,thresh=None,subset=None,inplace=False)
其使用方法如下:
参数 | 效果 |
axis |
默认axis=0。0为按行删除,1为按列删除 |
how |
默认'any','any'指带缺失值的所有行/列;'all'指清除一整行/列都是缺失值的行/列 |
thresh |
int,保留含有int个非nan值的行 |
subset |
删除特定列中包含缺失值的行或列 |
inplace |
默认False,即筛选后的数据存为副本,True表示直接在原数据上更改 |
使用函数:DataFrme.fillna()
fillna()函数根据使用方式的不同调用参数的方式存在较大的差异
前后替换:为利用前后有效值进行空值填充
dataframe.fillna(method = 'ffill') # 替换法之前向替换
dataframe.fillna(method = 'bfill') # 替换法之后向替换
整体替换:全范围整体替换
dataframe.fillna(value = 0) # 全表空值替换为0
列索引替换:根据列索引按实际情况设计列的替换值
dataframe.fillna(value={'index1':dataframe.index1.mode()[0],'index2':dataframe.index2.mean(),'index3':dataframe.index3.median()}) # 前三列检索列空值依次被众数,均值,中位数替换
当然在数据量不大的情况下,我们也可以使用最简单的方法——二重循环对全表进行检索,根据特点进行相应的数值替换
本文所指代的异常值是指具备数值意义的定量数据,并从分布的角度定义数据的异常
使用公式:
其中参数是样本均值,是样本标准差,当n取2时,满足条件的数值就可以定义为异常值,该方法适用于样本分布基本满足正态分布的数据
使用公式:
其中Q1为下四分位数,Q3为上四分位数,IOR为四分位差,n取1.5时,满足上述任一条件的数值即可视为异常值。因为箱线图不存在正态分布这一使用限制,故其适用于绝大多数定量数据的异常值判断
在经历重复值,缺失值处理及前期其余数据操作之后,数据表格往往已经具备了较为规范的结构,对于异常值,我们一般直接采取替换的方法,替换值可以采取原始数据均值、上四分位、下四分位等使用者觉得合理的数值,我们以将大于上四分位异常数值替换为上四分位为例:
Q1 = dataframe.index.quantile(q = 0.25)
Q3 = dataframe.index.quantile(q = 0.75)
IQR = Q3 - Q1
UL = Q3 + 1.5 * IQR
replace_value = dataframe.index[dataframe.index < UL].max()
dataframe.index[dataframe.index > UL] = replace_value