数据处理过程中,一般都需要进行数据的清洗工作,如数据集是否重复、是否存在缺失、是否具有完整性和一致性、数据中是否存在异常值等。
目录
一、重复观测处理
二、缺失值处理
三、异常值处理
一、重复观测处理
重复观测,顾名思义是指观测行存在重复的现象,重复观测的存在会影响数据分析和数据挖掘的准确性,所以在数据分析和建模之前需要进行观测的重复性检验,如果存在重复观测,还需要重复项的删除。
检测数据集的记录是否存在重复,可以使用duplicated方法进行验证,但是该方法返回每一行的检验结果,如果10行数据就会返回10个bool值。可以使用any值,只要有一个条件为True,那么any函数的结果就为True
#导入模块 import pandas as pd import numpy as np # 数据读入 df = pd.read_excel(r'''C:Usersyu'chuan'zhaoDesktoppythondatacourse第5章 Python数据处理工具--Pandasdata_test04.xlsx''') #重复观测的检测 print('数据集中是否存在重复观测:n',any(df.duplicated())) out: 数据集中是否存在重复观测: True
删除数据集中的重复观测:
#删除重复项 df.drop_duplicates(inplace=True) df
该方法中也有inplace参数,设置为True就表示直接在原始数据集上 *** 作。
二、缺失值处理缺失值是指数据集中的某些观测存在遗漏的指标值。一般而言当遇到缺失值时,可以用三种方法处置,分别是删除法、替换法和插补法。
删除法:当缺失的观测比例非常低时(5%以内)直接删除存在缺失的观测,或者当某些变量的缺失比例非常高时(如85%以上)直接删除这些缺失的变量
替换法:用某种常数直接替换那些缺失值。对于连续变量,可以使用均值或中位数替换;对于离散变量,可以使用众数替换
插补法:根据其他非缺失的变量或观测来预测缺失值,常见的插补法有回归插补法、K近邻插补法、拉格朗日插补法等。
检测数据集是否存在缺失值使用的是isnull方法,该方法仍然是基于每一行的检测,所以仍然需要使用any函数,返回整个数据集中是否存在缺失的结果。从代码返回的结果看,该数据集存在缺失值。
#数据读入 df=pd.read_excel(r'''C:Usersyu'chuan'zhaoDesktoppythondatacourse第5章 Python数据处理工具--Pandasdata_test05.xlsx''') #缺失观测的检测 print('数据集中是否存在缺失值:n',any(df.isnull())) out: 数据集中是否存在缺失值: True
dropna方法可以将所有含缺失值的行记录全部删除(行)
drop方法可以将变量删除(列)
fillna方法可以缺失值的替换,前向替换指用缺失值的前一个值替换,后向替换同理。(常用时间序列型的数据集)
使用value参数,常数替换,统计值替换(需要采用字典的方式传递给参数),例子是性别众数,年龄均值,收入中位数。
# 删除法之记录删除 df.dropna() # 删除法之变量删除 df.drop('age', axis = 1) # 替换法之前向替换 df.fillna(method = 'ffill') # 替换法之后向替换 df.fillna(method = 'bfill') # 替换法之常数替换 df.fillna(value = 0) # 替换法之统计值替换 df.fillna(value = {'gender':df.gender.mode()[0], 'age':df.age.mean(), 'income':df.income.median()})三、异常值处理
异常值是指那些远离正常值的观测,即“不合群”观测。
对于异常值的检测,一般采用两种方法,一种是n个标准差法,n=2时,满足条件的就是异常值,n=3满足条件的就是极端异常值。
另一种是箱线图判别法,Q1为下四分位数(25%),Q3为上四分位数(75%),IQR为四分位差(上四分位数与下四分位数的差),当n=1.5,满足条件的即为异常值,n=3时,满足条件的为极端异常值。
如果数据近似服从正态分布,优先选择n标准差法,因为数据的分布相对比较对称;否则选择箱线图法,因为分位数并不会受到极端值的影响。
# 数据读入 sunspots = pd.read_table(r'''C:Usersyu'chuan'zhaoDesktoppythondatacourse第5章 Python数据处理工具--Pandassunspots.csv''', sep = ',') # 异常值检测之标准差法 xbar = sunspots.counts.mean() xstd = sunspots.counts.std() print('标准差法异常值上限检测:n',any(sunspots.counts > xbar + 2 * xstd)) print('标准差法异常值下限检测:n',any(sunspots.counts < xbar - 2 * xstd)) # 异常值检测之箱线图法 Q1 = sunspots.counts.quantile(q = 0.25) Q3 = sunspots.counts.quantile(q = 0.75) IQR = Q3 - Q1 print('箱线图法异常值上限检测:n',any(sunspots.counts > Q3 + 1.5 * IQR)) print('箱线图法异常值下限检测:n',any(sunspots.counts < Q1 - 1.5 * IQR)) out: 标准差法异常值上限检测: True 标准差法异常值下限检测: False 箱线图法异常值上限检测: True 箱线图法异常值下限检测: False
检测结果说明存在异常值超过上限临界值的。
通过绘制数量的直方图和核密度曲线图,用来检测数据是否近似服从正态分布。
# 导入绘图模块 import matplotlib.pyplot as plt # 设置绘图风格 plt.style.use('ggplot') # 绘制直方图 sunspots.counts.plot(kind = 'hist', bins = 30, density = True) # 绘制核密度图 sunspots.counts.plot(kind = 'kde') # 图形展现 plt.show()
数据分布形状都是有偏的,不符合正态分布特点。
如何处理这些异常值?删除/替换
# 替换法处理异常值 print('异常值替换前的数据统计特征:n',sunspots.counts.describe()) # 箱线图中的异常值判别上限 UL = Q3 + 1.5 * IQR print('判别异常值的上限临界值:n',UL) # 从数据中找出低于判别上限的最大值 replace_value = sunspots.counts[sunspots.counts < UL].max() print('用以替换异常值的数据:n',replace_value) # 替换超过判别上限异常值 sunspots.counts[sunspots.counts > UL] = replace_value print('异常值替换后的数据统计特征:n',sunspots.counts.describe()) out: 判别异常值的上限临界值: 148.85000000000002 用以替换异常值的数据: 141.7
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)