熱線電話:13121318867

登錄
首頁大數據時代數據清洗之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實現缺失值處理的幾種方法,希望對大家缺失值的處理有所幫助。如果,大家在缺失值處理方面還有哪些好的方法,歡迎隨時和小編交流。


數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢