数据预处理(Part 1)
写这个系列的博客是为了总结自己所解决的有关数据分析问题的数据预处理部分涉及到的常用操作。废话不多说,开整!
Part 1主要涉及缺失值,异常值,重复值的常用处理操作
一.缺失值
针对缺失值的特征以及对结果的影响,主要采取以下三种做法:
1.删除缺失值:若数据量足够大,且缺失值不多,则采用直接删除的方法。
直接上dropna()函数!
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数说明:
Parameters | 解释说明 |
---|---|
axis | 0为行,1为列,默认值为0 |
how | ‘any’(删除存在缺失值的行)或’all’(删除全为缺失值的行) |
thresh | df.dropna(thresh = n):这一行除去NA值,剩余数值的数量大于等于n,便显示这一行 |
subset | df.dropna(subset = [ ]),subset为列表,在指定列删除缺失值 |
inplace | bool值:False(默认,即操作后的数据存储为副本);True(表示在原数据上进行操作修改) |
2.填充缺失值:若缺失值起着关键作用且不可缺少时,可以根据需要填充为指定值、平均值、中位数、众数等。
(1) 先说说fillna()函数!
DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None, **kwargs)
参数说明:
Parameters | 解释说明 |
---|---|
axis | 0为行,1为列,默认值为0 |
value | 可以为变量/字典/Series/DataFrame |
method | ‘backfill’/‘bfill’/‘pad’/‘ffill’/‘None’ (默认) |
subset | df.dropna(subset = [ ]),subset为列表,在指定列删除缺失值 |
inplace | bool值:False(默认,即操作后的数据存储为副本);True(直接修改原对象) |
limit | int,默认为None,限制填充个数,表示连续的NaN值的前向/后向填充的最大数量 |
downcast | dict,默认为None |
注(关于method 参数):
pad/ffill:用前一个非缺失值去填充该缺失值
backfill/bfill:用下一个非缺失值填充该缺失值
None:指定一个值去替换缺失值(缺省默认这种方式)
(2)常用填充值(这里仅关注value,省去其他参数)
①填充为指定值:
df.fillna(0) # 填充为0
②填充为平均值:
df.fillna(df.mean())
③填充为中位数:
df.fillna(df.median())
④填充为众数:
#1*众数不为Nan的请情况:
df.fillna(df.mode())
#2*考虑到可能由于缺失值过多而使众数为Nan的情况,应填充为除去Nan值后的众数
⑤填充为上下邻近数据:
df.fillna(method='pad') # 填充前一条数据的值
df.fillna(method='bfill') # 填充后一条数据的值
#考虑到前一条或后一条也不一定有值的情况,下一步可以再进行其他操作对未填充数据进行填充
3.不处理:若缺失值占比较小且对于结果基本无影响,则采用不处理的方法。
不用处理就爽歪歪哈哈哈
二.异常值
1.如何得知是否存在异常值
这里提供一个方法:画图!!!
通过画散点图、直方图、箱型图等一系列图,直观感受数据是否存在异常值。
2.对于异常值主要采取两个方法:
(1)若异常值所在行的其他数据比较重要或对结果会产生较大的影响,结合上下 行数据对其进行合理填充。
(2)若异常值所在行其他数据重要性较低或不会对结果产生较大的影响,则直接 删除。
—>>>可以看到,当找出异常值之后,所要做的工作就转化为对异常值的删除、删除后填充—>又回到缺失值的处理了!!
二.重复值
直接上drop_duplicates()函数!
DataFrame.drop_duplicates(subset=None, keep = 'first',inplace=False,)
Parameters | 解释说明 |
---|---|
subset | list,对应的值为列名,默认为None,即考虑所有列 |
Keep | ‘first’(保留第一次出现的重复行)/‘last’(保留最后一次出现的重复行)/‘False’ (去除所有重复行) |
inplace | 不再赘述 |
要明确的是,处理重复值通常会分为两种情况:
①去除完全重复的行数据
df.drop_duplicates()
②是去除某几列重复的行数据
df.drop_duplicates(subset=[],keep='',inplace=True)