(1)直接删除法(当缺失值个数只占整体很小一部分时)
在采用删除法处理缺失值时,需要首先检测样本总体中确实值得的个数。python中统计缺失值的方法为:
import numpy as np
import pandas as pd
#读取数据,将空值形式的缺失值转换为可识别的类型
data = pd.read_csv('data.csv',encoding='GBK')
#用NaN代替空值
data = data.replace(' ',np,NaN)
print(data.columns)#['id','label','a','b','c','d']
#将每列的缺失值个数统计出来
null_all = data.isnull().sum()
#isnull函数检查数据是否有缺失返回布尔值,元素为空或者NaN返回Ture,否则就是False
#data.isnull().any()判断哪些列包含缺失值,该列存在缺失值则返回True,反之False
#data.isnull().sum()返回每列缺失值的数量
#查看a列缺失值的数据
a_null = data[pd.isnull(data['a'])]
#a列缺失值占的比重
a_ratio = len(data[pd.isnull(data['a'])])/len(data)#0.007
#缺失值所占的比重较小,丢弃缺失值,将存在缺失值的行丢弃
new_drop = data.dropna(axis=0)#(9981,6)
print(new_drop.shape)
#dropna()默认axis=0,删除带有空值的行(只要有一个就删除整行),axis=1删除带有空值的列
#dropna(how='all')整行都是空值时,才会被删除
#dropna(thresh=2),thresh设置阈值,缺失值个数大于该阈值整行(axis=0)或整列(axis=1)才会被删除
#丢弃某几列有缺失值的行
new_drop2 = data.dropna(axis=0,subset=['a','b'])#a和b列没有缺失值,所以不删除元素
print(new_drop2.shape)#(9990,6)
(2)使用一个全局常量填充缺失值
#用0填充缺失值
fill_data = data.fillna(0)
print(fill_data.isnull().sum())
#用一个数字填充缺失值df.fillna(0)
#用前一个数据代替缺失值:method='pad';
#用后一个数据代替缺失值:method='bfill';df.finall(method='bfill')
#用一个字符串代替缺失值,df.fillna('unknow')
#使用描述性统计的值代替缺失值,例如使用平均值代替缺失值
#df.fillna(df.mean())
#finall函数也实现不同的列,用不同的值进行填充,df.finall({1:0.5,3:-1})
#第一列用0.5填充,第三列用-1填充
#fillna默认返回新对象,可以使用inplace参数实现对现有对象直接进行修改
#new_data = df.finall(0,inplace=True)
(3)使用统计数字进行填充
#均值填充
data['a'] = data['a'].finall(data['a'].means())
#中位数填充
data['a'] = data['a'].finall(data['a'].median())
#众数填充
data['a'] = data['a'].finall(stats.mode(data['a'])[0][0])
#用前一个数字填充
data['a'] = data['a'].finall(method='pad')
#用后一个数字填充
data['a'] = data['a'].finall(method='bfill')
Imputer提供了缺失值处理的基本策略,比如使用缺失值所在的行或者列的均值,中位数,众数来代替缺失值
from sklearn.preprocessing import Imputer
imr = Imputer(missing_values='NaN',strategy='mean',axis=0)
imr = imr.fit(data.values)
imputed_data = pd.DataFrame(imr.transform(data.values))
print(imputed_data[0:15])
#strategy默认平均值填充,可选'median'(中位数),'most_frequent'(众数)
#指定轴向axis=0(默认列向);axis = 1,行向
#copy 默认True:创建数据集的副本;False:在任何地方都可以进行插值
(4)插值法,KNN填充
4.1 插值法
Interpolate()插值法,计算缺失值前一个和后一个值的平均数
data['a'] = data['a'].interpolate()
4.2 KNN填充
from fancyimpute import KNN
fill_knn = KNN(k=3).fit_transform(data)
data = pd.DataFrame(fill_knn)
print(data.head())