python處理數據中缺失值

(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())

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章