一、数据缺失值处理
处理方法:
1、删除
2、补全: 常用补全方法有(1)用基本统计量填充(最大值、最小值、均值、中位数、众数)
(2) 用表内临近值填充
(3)用分类临界值、基本统计量填充
(4)用回归模型填充,将缺失字段作为目标变量进行预测
(5)多重插补
3、真值转换法:该方法将缺失值也作为数据分布规律的一部分,将缺失值和实际值都作为输入维度参与后续 数据处理和模型计算。
4、不处理:若后期的模型对缺失值有容忍度或有灵活的处理方法,则可不进行处理。常见的能够自动处理缺失值的模型包括:KNN、决策树、随机森林、神经网络、朴素贝叶斯、DBSCAN等。
#生成缺失数据
1 import numpy as np 2 import pandas as pd 3 df=pd.DataFrame(np.random.randn(6,3),columns=['var_1','var_2','var_3']) 4 df.ix[2,1:]=np.nan 5 df.ix[4:,0]=np.nan 6 print(df)
var_1 var_2 var_3
0 -0.861766 -0.485220 -1.377067
1 -0.897174 -1.214410 -1.922518
2 -0.058318 NaN NaN
3 1.101776 0.042510 0.333608
4 NaN -0.127705 -1.165975
5 NaN -1.027285 -0.005494
#查看缺失值
1 print(df[(df.isnull()).any(1)])
var_1 var_2 var_3
2 -0.058318 NaN NaN
4 NaN -0.127705 -1.165975
5 NaN -1.027285 -0.00549
#删除有缺失值的行
1 df2=df.dropna() 2 print(df2)
var_1 var_2 var_3
0 -0.861766 -0.48522 -1.377067
1 -0.897174 -1.21441 -1.922518
3 1.101776 0.04251 0.333608
#用临界值填补
1 df_ffill=df.fillna(method='ffill') #向前填充 2 print(df_ffill) 3 df_bfill=df.fillna(method='bfill') #向后填充 4 print(df_bfill)
var_1 var_2 var_3
0 -0.861766 -0.485220 -1.377067
1 -0.897174 -1.214410 -1.922518
2 -0.058318 -1.214410 -1.922518
3 1.101776 0.042510 0.333608
4 1.101776 -0.127705 -1.165975
5 1.101776 -1.027285 -0.005494
var_1 var_2 var_3
0 -0.861766 -0.485220 -1.377067
1 -0.897174 -1.214410 -1.922518
2 -0.058318 0.042510 0.333608
3 1.101776 0.042510 0.333608
4 NaN -0.127705 -1.165975
5 NaN -1.027285 -0.00549
#用各列的均值填充
1 df_mean=df.fillna(df.mean()['var_1':'var_3']) 2 print(df_mean)
var_1 var_2 var_3
0 -0.861766 -0.485220 -1.377067
1 -0.897174 -1.214410 -1.922518
2 -0.058318 -0.562422 -0.827489
3 1.101776 0.042510 0.333608
4 -0.178870 -0.127705 -1.165975
5 -0.178870 -1.027285 -0.00549
#用指定值填充
1 df_num=df.fillna({'var_1':99,'var_2':100,'var_3':199}) 2 print(df_num)
var_1 var_2 var_3
0 -0.861766 -0.485220 -1.377067
1 -0.897174 -1.214410 -1.922518
2 -0.058318 100.000000 199.000000
3 1.101776 0.042510 0.333608
4 99.000000 -0.127705 -1.165975
5 99.000000 -1.027285 -0.005494
二、异常值处理
异常值是数据分布的常态,处于特定分布区域或范围之外的数据通常被定义为异常或噪声。异常分为两种:“伪异常”,由于特定的业务运营动作产生,是正常反应业务的状态,而不是数据本身的异常;“真异常”,不是由于特定的业务运营动作产生,而是数据本身分布异常。通常异常值会在数据的预处理中被删除掉。
下例代码使用Z标准化得到的阀值作为判断标准,当标准化后的得分超过阀值则为异常。
#生成异常值数据
1 import numpy as np 2 import pandas as pd 3 df=pd.DataFrame({'var_1':[1,2,3,4,5,6,150],'var_2':[3,4,180,1,2,5,3]}) 4 print(df)
var_1 var_2
0 1 3
1 2 4
2 3 180
3 4 1
4 5 2
5 6 5
6 150 3
#判断异常值
1 z_score=(df-df.mean())/df.std() 2 df_zscore=z_score.abs()>2.2 3 print(df_zscore)
var_1 var_2
0 False False
1 False False
2 False True
3 False False
4 False False
5 False False
6 True Fals
#用中位数替换掉异常值
1 df_num=df.copy() 2 df_num=pd.DataFrame(np.where(df_zscore,df_num.median(),df_num),columns=['var_1','var_2']) 3 print(df_num)
var_1 var_2
0 1.0 3.0
1 2.0 4.0
2 3.0 3.0
3 4.0 1.0
4 5.0 2.0
5 6.0 5.0
6 4.0 3.0
#删除异常值
1 df_drop=pd.DataFrame(np.where(df_zscore,np.nan,df),columns=['var_1','var_2']) 2 df_drop=df_drop.dropna() 3 print(df_drop)
var_1 var_2
0 1.0 3.0
1 2.0 4.0
3 4.0 1.0
4 5.0 2.0
5 6.0 5.0
三、重复值处理
重复值处理的方法是去重,目的是保留能显示特征的唯一记录数据。
#生成重复数据
1 import numpy as np 2 import pandas as pd 3 df=pd.DataFrame({'var_1':['a','b','c','a'],'var_2':[4,5,6,4]}) 4 print(df)
var_1 var_2
0 a 4
1 b 5
2 c 6
3 a 4
#判断重复数据
1 df_isduplicated=df.duplicated(keep=False) #只要不是唯一值都显示true 2 print(df_isduplicated) 3 print(df[df_isduplicated])
0 True
1 False
2 False
3 True
dtype: bool
var_1 var_2
0 a 4
3 a 4
#删除重复值
1 df_drop=df.drop_duplicates() 2 print(df_drop)
var_1 var_2
0 a 4
1 b 5
2 c 6
四、将分类变量转换为哑变量
非数值型数据可以分为:(1)分类数据:分类数据中的值没有大小、等级、好坏等的划分,仅仅表示不同的类别,例性别的划分。
(2)顺序数据:不同的类别有排序规律和逻辑层次的划分,例学历的划分
非数值型数据转换为数值型数据的最佳方法是:将分类变量转换为哑变量矩阵。
不用数字来表示不同分类的原因是,这样表示无法还原不同类别信息间的差异和相互关联性。
对于分类数据,例性别,用1代表男性,2代表女性,数值1,2间有距离为1的差异,但实际上,男女性别是不存在这种差异的;对于顺序数据,例学历变量中的博士、研究生、学士分别用3,2,1来代表,如何确定这三个类别间距是1而不是其他值呢,因此有序数字的排序无法准确表达出顺序数据的差异性。
#生成数据
1 import numpy as np 2 import pandas as pd 3 df=pd.DataFrame({'id':[111,222,333],'city':['beijing','tianjin','beijing'],'sex':['male','male','female'],'level':['high','middle','low']},columns=['id','city','sex','level']) 4 print(df)
id city sex level
0 111 beijing male high
1 222 tianjin male middle
2 333 beijing female low
#生成哑变量
1 df_dv=df.copy() 2 col=df.columns.delete(0) 3 for i in col: 4 new=pd.get_dummies(df_dv[i],prefix=i) 5 df_dv=df_dv.join(new) 6 df_dv=df_dv.drop(i,axis=1) 7 print(df_dv)
id city_beijing city_tianjin sex_female sex_male level_high level_low level_middle
0 111 1 0 0 1 1 0 0
1 222 0 1 0 1 0 0 1
2 333 1 0 1 0 0 1 0