登录
首页大数据时代数据清洗之python实现缺失值处理
数据清洗之python实现缺失值处理
2020-07-24
收藏

在实际的数据清洗过程中,我们经常会遇到数据内容丢失的情况,这些丢失的数据内容就是缺失值。缺失值的产生的原因多种多样,主要分为机械原因和人为原因。

机械原因,也就是由于例如,数据存储失败,存储器损坏,机械故障等原因,某段时间数据未能收集,或保存的失败,从而造成的数据缺失。人为原因,主要是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失。比如,在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据。不管是哪种原因造成的,我们都必须对缺失数据进行妥善处理,才能更好的保证最终数据分析结果的正确性和准确性。下面小编就介绍几种缺失值处理常用的方法,希望对大家有所帮助。

1.删除

如果缺失值的个数只占整体很小一部分的情况下,可以删除缺失值。

这种方法是将存在缺失值的数据条目(包括:对象,元组,记录)进行删除。简单便捷,在对象有多个属性缺失值、被删除的含缺失值的对象的数据量只占信息表中的数据量一小部分的情况下是非常有效的。

python代码


import numpy as np
import pandas as pd
data = pd.read_csv('data.csv',encoding='GBK')
# 将空值形式的缺失值转换成可识别的类型
data = data.replace(' ', np.NaN)
print(data.columns)#['id', 'label', 'a', 'b', 'c', 'd']
#将每列中缺失值的个数统计出来
null_all = data.isnull().sum()
#id       0
#label    0
#a        7
#b        3
#c        3
#d        8
#查看a列有缺失值的数据
a_null = data[pd.isnull(data['a'])]
#a列缺失占比
a_ratio = len(data[pd.isnull(data['a'])])/len(data) #0.0007
#丢弃缺失值,将存在缺失值的行丢失
new_drop = data.dropna(axis=0)
print(new_drop.shape)#(9981,6)

#丢弃某几列有缺失值的行
new_drop2 = data.dropna(axis=0, subset=['a','b'])
print(new_drop2.shape)#(9990,6)


2.均值、众数、中位数填充

均值填充:对每一列的缺失值,填充当列的均值。

中位数填充:对每一列的缺失值,填充当列的中位数。

众数填充:对每一列的缺失值,填充当列的众数。

python代码


data['a'] = data['a'].fillna(data['a'].means())
#中位数填充
data['a'] = data['a'].fillna(data['a'].median())
#众数填充
data['a'] = data['a'].fillna(stats.mode(data['a'])[0][0])
#用前一个数据进行填充
data['a'] = data['a'].fillna(method='pad')
#用后一个数据进行填充
data['a'] = data['a'].fillna(method='bfill')


3.填充上下条的数据

对每一条数据的缺失值,填充其上下条数据的值。

python代码


train_data.fillna(method='pad', inplace=True) # 填充前一条数据的值,但是前一条也不一定有值
train_data.fillna(0, inplace=True)
 
train_data.fillna(method='bfill', inplace=True) # 填充后一条数据的值,但是后一条也不一定有值
train_data.fillna(0, inplace=True)


4.填充插值得到的数据

interpolate()插值法,计算的是缺失值前一个值和后一个值的平均数。

python代码


data['a'] = data['a'].interpolate()


5.KNN填充

填充近邻的数据,先利用KNN计算临近的k个数据,然后填充他们的均值。


from fancyimpute import KNN
fill_knn = KNN(k=3).fit_transform(data)
data = pd.DataFrame(fill_knn)
print(data.head())
#out 
       0    1    2       3         4    5
0  111.0  0.0  2.0   360.0  4.000000  1.0
1  112.0  1.0  9.0  1080.0  3.000000  1.0
2  113.0  1.0  9.0  1080.0  2.000000  1.0
3  114.0  0.0  1.0   360.0 *3.862873 *1.0
4  115.0  0.0  1.0   270.0  5.000000  1.0


6.随机森林填充


from sklearn.ensemble import RandomForestRegressor
#提取已有的数据特征
process_df = data.ix[:, [1, 2, 3, 4, 5]]
# 分成已知该特征和未知该特征两部分
known = process_df[process_df.c.notnull()].as_matrix()
uknown = process_df[process_df.c.isnull()].as_matrix()
# X为特征属性值
X = known[:, 1:3]
# print(X[0:10])
# Y为结果标签
y = known[:, 0]
print(y)
# 训练模型
rf = RandomForestRegressor(random_state=0, n_estimators=200, max_depth=3, n_jobs=-1)
rf.fit(X, y)
# 预测缺失值
predicted = rf.predict(uknown[:, 1:3])
print(predicted)
#将预测值填补原缺失值
data.loc[(data.c.isnull()), 'c'] = predicted
print(data[0:10])
以上就是小编给大家分享的python实现缺失值处理的几种方法,希望对大家缺失值的处理有所帮助。如果,大家在缺失值处理方面还有哪些好的方法,欢迎随时和小编交流。


数据分析咨询请扫描二维码

客服在线
立即咨询