对于数据分析和分析人员来说,数据预处理的过程常常站用了大部分工作量,数据缺失值往往是不可避免要面对的问题,值得注意的是缺失值不仅仅是指那些数据中NULL值,也包括表示数据缺失的特殊数值。
一般来说,对数据缺失值的有多种,可以用一个常值来填充,但这不是一个好方法,一般可以选择使用均值、中位数来填充会更好一些,还有其他方法,可根据实际情况选择对应的方法,如下总结(并给出相应的最常用的实现代码):
整体目录如下:
1缺失值处理
- 缺失值的识别
- 用数据填充
- 删除缺失值
1.1用数据填充:
- 使用一个自定义值进行填充
- 使用相邻的数据进行填充
- 使用一个字符串进行填充
- 使用统计数进行填充(如:平均数,中位数,众数)
- 使用插值法进行填充
- KNN预测缺失值进行填充
- 使用模型预测的值进行填充
- 拉格朗日插值法,牛顿插值法,Hermite插值,分段插值,样条插值(由于有几种方法在数据预处理时,并不是太常用,只给出了对应连接,望各位海涵,根据所需选取方法,抱歉,抱歉)
1.1删除缺失值
- 删除有缺失值的行
- 删除有缺失值的列
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]]
- 用数据填充
- 使用一个自定义值进行填充
- 使用相邻的数据进行填充
- 使用一个字符串进行填充
- 使用统计数进行填充(如:平均数,中位数,众数)
- 使用插值法进行填充
"""------------填充数据----------------"""
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