缺失值、异常值、重复值处理及哑变量变换


一、数据缺失值处理

处理方法:

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

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM