数据挖掘基础学习(1)数据清洗:重复值、缺失值、异常值处理

        本文暂不讨论数据类型转换、离散变量重编码、冗余信息及无意义信息处理方法,仅先从最基本数据清洗规则:重复值、缺失值、异常值处理角度入手进行讨论,其余部分内容将在后期进行说明

注:本文讨论内容基于Python语言,处理对象为常规pandas读取数据表格格式Dataframe

一、重复值处理

1.数据预览

        使用函数: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()可以实现对表格数据重复性的预览,进而决定采取怎样的措施处理重复数据

2.删除重复记录

使用函数:dataframe.drop_duplicates(subset=['A','B'],keep='first',inplace=True)

通常,对于重复数据我们采用直接删除的方法进行处理,这里我们采用的dataframe.drop_duplicates()在使用上完全与duplicated()相同,参数inplace=True代表直接在原本Dataframe上进行数据删除,inplace=False代表生成副本

二、缺失值处理

1.数据预览

        使用函数:dataframe.isnull()

        dataframe.isnull()会返回一个和调用dataframe结构相同的bool类型dataframe,该dataframe对应位置的bool值代表该处是否为空,这种方法并不直观,我们可以通过:

dataframe.isnull().sum() #列检索空值累加
dataframe.isnull().transpose().sum() #行检索空值累加

        进一步确认空值在各行各列的分布情况并采取对应的处理方法

2.缺失值处理

        评估缺失值的缺失情况,我们主要采取:删除缺失记录,删除缺失索引,替换和插值四种方法,这里暂不讨论插值

a.删除缺失记录/删除缺失索引

        使用函数: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表示直接在原数据上更改

b.删除缺失值

        使用函数: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()}) # 前三列检索列空值依次被众数,均值,中位数替换

        当然在数据量不大的情况下,我们也可以使用最简单的方法——二重循环对全表进行检索,根据特点进行相应的数值替换

三、异常值处理

本文所指代的异常值是指具备数值意义的定量数据,并从分布的角度定义数据的异常

1.数据预览

a.n个标准差法

        使用公式:

outliner>|\bar{x}\pm n\sigma |

        其中参数\bar{x}是样本均值,\sigma是样本标准差,当n取2时,满足条件的数值就可以定义为异常值,该方法适用于样本分布基本满足正态分布的数据

b.箱线图判别法

        使用公式:

outliner>Q3+nIQR,outliner>Q1-nIQR

        其中Q1为下四分位数,Q3为上四分位数,IOR为四分位差,n取1.5时,满足上述任一条件的数值即可视为异常值。因为箱线图不存在正态分布这一使用限制,故其适用于绝大多数定量数据的异常值判断

2.异常值替换

        在经历重复值,缺失值处理及前期其余数据操作之后,数据表格往往已经具备了较为规范的结构,对于异常值,我们一般直接采取替换的方法,替换值可以采取原始数据均值、上四分位、下四分位等使用者觉得合理的数值,我们以将大于上四分位异常数值替换为上四分位为例:

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

你可能感兴趣的:(数据挖掘,学习,pandas)