python数据清洗实例_数据清洗之python实现缺失值处理

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

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

1.删除

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

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

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.均值、众数、中位数填充

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

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

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

20200724162810_90711.jpg

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.填充上下条的数据

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

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()插值法,计算的是缺失值前一个值和后一个值的平均数。

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实现缺失值处理的几种方法,希望对大家缺失值的处理有所帮助。如果,大家在缺失值处理方面还有哪些好的方法,欢迎随时和小编交流。

完 谢谢观看

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值