机器学习pandas之缺失值的处理方法

对于数据分析和分析人员来说,数据预处理的过程常常站用了大部分工作量,数据缺失值往往是不可避免要面对的问题,值得注意的是缺失值不仅仅是指那些数据中NULL值,也包括表示数据缺失的特殊数值。

一般来说,对数据缺失值的有多种,可以用一个常值来填充,但这不是一个好方法,一般可以选择使用均值、中位数来填充会更好一些,还有其他方法,可根据实际情况选择对应的方法,如下总结(并给出相应的最常用的实现代码):

整体目录如下:

1缺失值处理

  • 缺失值的识别
  • 用数据填充
  • 删除缺失值

1.1用数据填充:

  1. 使用一个自定义值进行填充
  2. 使用相邻的数据进行填充
  3. 使用一个字符串进行填充
  4. 使用统计数进行填充(如:平均数,中位数,众数)
  5. 使用插值法进行填充
  6. KNN预测缺失值进行填充
  7. 使用模型预测的值进行填充
  8. 拉格朗日插值法,牛顿插值法,Hermite插值,分段插值,样条插值(由于有几种方法在数据预处理时,并不是太常用,只给出了对应连接,望各位海涵,根据所需选取方法,抱歉,抱歉)

1.1删除缺失值

  1. 删除有缺失值的行
  2. 删除有缺失值的列

2代码实现:

  • 缺失值的识别
df = pd.DataFrame(np.random.randn(6,4),index=list('ABCDEF'),
 columns=['one','two','three','four'])
df.ix[2,:-2] = np.nan
df.ix[2:-1,2] = np.nan
print("带有缺失值的数据")
print(df)
"""------------缺失值的识别----------------"""
print("对整个数据表进行识别")
print(df.isnull())
print("判断哪些列存在缺失值")
print(df.isnull().any())
print("展示数据缺失值的位置,用True表示")
print(df.isnull().values==True)

结果:

带有缺失值的数据
 one two three four
A -0.237301 -0.199300 -1.118724 -0.297546
B 0.798133 -1.250229 1.024470 -0.809775
C NaN NaN NaN -1.815079
D 0.971362 0.779022 NaN 0.246423
E -1.312634 -0.543223 NaN 0.212205
F -0.164457 0.551197 -1.561074 0.328119
对整个数据表进行识别
 one two three four
A False False False False
B False False False False
C True True True False
D False False True False
E False False True False
F False False False False
判断哪些列存在缺失值
one True
two True
three True
four False
dtype: bool
展示数据缺失值的位置,用True表示
[[False False False False]
 [False False False False]
 [ True True True False]
 [False False True False]
 [False False True False]
 [False False False False]]
  • 用数据填充
  1. 使用一个自定义值进行填充
  2. 使用相邻的数据进行填充
  3. 使用一个字符串进行填充
  4. 使用统计数进行填充(如:平均数,中位数,众数)
  5. 使用插值法进行填充
"""------------填充数据----------------"""
print("DataFrame.fillna()填充数据")
print("使用固定值代替缺失值")
print(df.fillna(3))
print("使用字符串替换缺失值")
print(df.fillna('default'))
print("用前一个数替换缺失值")
print(df.fillna(method='pad'))
print("用后一个数替换缺失值")
print(df.fillna(method='bfill',limit=1))
print("用统计数替换缺失值,如平均数")
print(df.fillna(df.mean()))#用每一列的均值填充
print("还可以指定列来,替换缺失值")
print(df.fillna(df.mean()['one':'three']))
print("用统计数替换缺失值,如中位数")
print(df.fillna(df.median()))#用每一列的中位数填充
print("插值法填补缺失值")
print(df.interpolate())

结果:

DataFrame.fillna()填充数据
使用固定值代替缺失值
 one two three four
A -1.575305 -1.008663 0.977786 0.676524
B -1.783497 -1.163313 -0.163660 0.179757
C 3.000000 3.000000 3.000000 0.088426
D -0.780804 0.221797 3.000000 -2.346366
E 0.222073 1.405310 3.000000 0.730976
F -0.213540 -0.307353 -0.171884 -1.084435
使用字符串替换缺失值
 one two three four
A -1.57531 -1.00866 0.977786 0.676524
B -1.7835 -1.16331 -0.16366 0.179757
C default default default 0.088426
D -0.780804 0.221797 default -2.346366
E 0.222073 1.40531 default 0.730976
F -0.21354 -0.307353 -0.171884 -1.084435
用前一个数替换缺失值
 one two three four
A -1.575305 -1.008663 0.977786 0.676524
B -1.783497 -1.163313 -0.163660 0.179757
C -1.783497 -1.163313 -0.163660 0.088426
D -0.780804 0.221797 -0.163660 -2.346366
E 0.222073 1.405310 -0.163660 0.730976
F -0.213540 -0.307353 -0.171884 -1.084435
用后一个数替换缺失值
 one two three four
A -1.575305 -1.008663 0.977786 0.676524
B -1.783497 -1.163313 -0.163660 0.179757
C -0.780804 0.221797 NaN 0.088426
D -0.780804 0.221797 NaN -2.346366
E 0.222073 1.405310 -0.171884 0.730976
F -0.213540 -0.307353 -0.171884 -1.084435
用统计数替换缺失值,如平均数
 one two three four
A -1.575305 -1.008663 0.977786 0.676524
B -1.783497 -1.163313 -0.163660 0.179757
C -0.826215 -0.170444 0.214081 0.088426
D -0.780804 0.221797 0.214081 -2.346366
E 0.222073 1.405310 0.214081 0.730976
F -0.213540 -0.307353 -0.171884 -1.084435
还可以指定列来,替换缺失值
 one two three four
A -1.575305 -1.008663 0.977786 0.676524
B -1.783497 -1.163313 -0.163660 0.179757
C -0.826215 -0.170444 0.214081 0.088426
D -0.780804 0.221797 0.214081 -2.346366
E 0.222073 1.405310 0.214081 0.730976
F -0.213540 -0.307353 -0.171884 -1.084435
用统计数替换缺失值,如中位数
 one two three four
A -1.575305 -1.008663 0.977786 0.676524
B -1.783497 -1.163313 -0.163660 0.179757
C -0.780804 -0.307353 -0.163660 0.088426
D -0.780804 0.221797 -0.163660 -2.346366
E 0.222073 1.405310 -0.163660 0.730976
F -0.213540 -0.307353 -0.171884 -1.084435
插值法填补缺失值
 one two three four
A -1.575305 -1.008663 0.977786 0.676524
B -1.783497 -1.163313 -0.163660 0.179757
C -1.282151 -0.470758 -0.165716 0.088426
D -0.780804 0.221797 -0.167772 -2.346366
E 0.222073 1.405310 -0.169828 0.730976
F -0.213540 -0.307353 -0.171884 -1.084435

插值的方法有多种可以取均值/中位数/众数,也可以用固定值插补,还可以用临近值来填补。除了上述方法,还可以用预测方法来填补缺失值,这类方法称为插值法。

插值法有拉格朗日插值法、牛顿插值法,Hermite插值、分段插值、样条插值法等,下面对一些常用方法进行简单的汇总。

深入理解缺失值的处理:https://blog.csdn.net/zrjdds/article/details/50223091

使用拉格朗日

https://blog.csdn.net/momaojia/article/details/73549675

KNN预测缺失值进行填充

使用KNN需要安装fancyimpute,但是这个包在windows中安装的过程有点麻烦,需要安装一些其他的包支持,可参见:

https://isystems.github.io/HSE545/machine%20learning%20all/cvxpy_install/CVXPY%2BInstallation%2BGuide%2Bfor%2BWindows.html

KNN的使用教程:

https://blog.csdn.net/weixin_41512727/article/details/83180661

使用模型预测的值进行填充

https://blog.csdn.net/jingyi130705008/article/details/82670011(强烈推荐,里面有完整的各种方法对比,包含了众数的填补方法)

牛顿插值法

https://blog.csdn.net/deramer1/article/details/79037740

删除缺失值

"""------------删除缺失值----------------"""
print("删除有缺失值的行")
print(df.dropna(axis=0))
print("只有行里的数据全部为空时才删除")
print(df.dropna(how='all'))
print("删除有缺失值的列")
print(df.dropna(axis=1))
print("只有列里的数据全部为空时才删除")
print(df.dropna(how='all',axis=1))

结果:

删除有缺失值的行
 one two three four
A -1.575305 -1.008663 0.977786 0.676524
B -1.783497 -1.163313 -0.163660 0.179757
F -0.213540 -0.307353 -0.171884 -1.084435
只有行里的数据全部为空时才删除
 one two three four
A -1.575305 -1.008663 0.977786 0.676524
B -1.783497 -1.163313 -0.163660 0.179757
C NaN NaN NaN 0.088426
D -0.780804 0.221797 NaN -2.346366
E 0.222073 1.405310 NaN 0.730976
F -0.213540 -0.307353 -0.171884 -1.084435
删除有缺失值的列
 four
A 0.676524
B 0.179757
C 0.088426
D -2.346366
E 0.730976
F -1.084435
只有列里的数据全部为空时才删除
 one two three four
A -1.575305 -1.008663 0.977786 0.676524
B -1.783497 -1.163313 -0.163660 0.179757
C NaN NaN NaN 0.088426
D -0.780804 0.221797 NaN -2.346366
E 0.222073 1.405310 NaN 0.730976
F -0.213540 -0.307353 -0.171884 -1.084435

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值