Python數據清洗(二):缺失值識別與處理

2020-12-17 CDA數據分析師

作者 | 劉順祥 來源 | 數據分析1480

前言

在《Python數據清洗(一):類型轉換和冗餘數據刪除》中分享了有關數據類型轉換和冗餘信息刪除的兩個知識點,接下來繼續講解缺失值的識別和處理辦法。缺失值指的是由於人為或機器等原因導致數據記錄的丟失或隱瞞,缺失值的存在一定程度上會影響後續數據分析和挖掘的結果,所以對他的處理將顯得尤為重要。

缺失值的識別

判斷一個數據集是否存在缺失觀測,通常從兩個方面入手,一個是變量的角度,即判斷每個變量中是否包含缺失值;另一個是數據行的角度,即判斷每行數據中是否包含缺失值。關於缺失值的判斷可以使用isnull方法。下面使用isnull方法對data3數據(數據可至中---下載)進行判斷,統計輸出的結果如下表所示。

# 判斷各變量中是否存在缺失值data3.isnull().any(axis = 0)# 各變量中缺失值的數量data3.isnull().sum(axis = 0)# 各變量中缺失值的比例data3.isnull().sum(axis = 0)/data3.shape[0]

如上結果所示,數據集data3中有三個變量存在缺失值,即gender、age和edu,它們的缺失數量分別為136、100和1,927,缺失比例分別為4.53%、3.33%和64.23%。

需要說明的是,判斷數據是否為缺失值NaN,可以使用isnull「方法」,它會返回與原數據行列數相同的矩陣,並且矩陣的元素為bool類型的值,為了得到每一列的判斷結果,仍然需要any「方法」(且設置「方法」內的axis參數為0);統計各變量的缺失值個數可以在isnull的基礎上使用sum「方法」(同樣需要設置axis參數為0);計算缺失比例就是在缺失數量的基礎上除以總的樣本量(shape方法返回數據集的行數和列數,[0]表示取出對應的數據行數)。

讀者可能對代碼中的「axis=0」感到困惑,它代表了什麼?為什麼是0?是否還可以寫其他值?下面通過圖表的形式來說明axis參數的用法:

假設上圖為學生的考試成績表,如果直接對成績表中的分數進行加和操作,得到的是所有學生的分數總和(很顯然沒有什麼意義),如果按學生分別計算總分,將是上圖從左到右的轉換。該轉換的特徵是列數發生了變化(可以是列數減少,也可以是列數增多),類似於在水平方向上受了外部的壓力或拉力,這樣的外力就理解為軸axis為1的效果(便於理解,可以想像為飛機在有動力的情況下,可以保持水平飛行狀態)。

同樣對於如上的學生成績表,如果直接對成績表中的分數計算平均值,得到的是所有學生的平均分數(很顯然也沒有什麼意義),如果按學科分別計算平均分,將是上圖中從上到下的轉換。該轉換的特徵是行數發生了變化(可以是行數減少,也可以是行數增多),類似於在垂直方向上受了外部的擠壓或拉伸,這樣的外力就理解為軸axis為0的效果(便於理解,可以想像為飛機在沒有動力的情況下,呈下降趨勢)。

如上是關於變量方面的缺失值判斷過程,還可以利用下方的代碼識別數據行的缺失值分布情況:

# 判斷數據行中是否存在缺失值

如上結果所示,返回True值,說明data3中的數據行存在缺失值。代碼中使用了兩次any「方法」,第一次用於判斷每一行對應的True(即行內有缺失值)或False值(即行內沒有缺失值);第二次則用於綜合判斷所有數據行中是否包含缺失值。同理,進一步還可以判斷缺失行的具體數量和佔比,代碼如下:

# 缺失觀測的行數data3.isnull().any(axis = 1).sum()# 缺失觀測的比例data3.isnull().any(axis = 1).sum()/data3.shape[0]

如上結果所示,3000行的數據集中有2024行存在缺失值,缺失行的比例約67.47%。不管是變量角度的缺失值判斷,還是數據行角度的缺失值判斷,一旦發現缺失值,都需要對其作相應的處理,否則一定程度上都會影響數據分析或挖掘的準確性。

缺失值的處理辦法

通常對於缺失值的處理,最常用的方法無外乎刪除法、替換法和插補法。刪除法是指將缺失值所在的觀測行刪除(前提是缺失行的比例非常低,如5%以內),或者刪除缺失值所對應的變量(前提是該變量中包含的缺失值比例非常高,如70%左右);替換法是指直接利用缺失變量的均值、中位數或眾數替換該變量中的缺失值,其好處是缺失值的處理速度快,弊端是易產生有偏估計,導致缺失值替換的準確性下降;插補法則是利用有監督的機器學習方法(如回歸模型、樹模型、網絡模型等)對缺失值作預測,其優勢在於預測的準確性高,缺點是需要大量的計算,導致缺失值的處理速度大打折扣。下面將選擇刪除法、替換法和插補法對缺失值進行處理,代碼如下:

# 刪除欄位 -- 如刪除缺失率非常高的edu變量data3.drop(labels = 'edu', axis = 1, inplace=True)# 數據預覽data3.head()

如上結果所示,表中的edu變量已被成功刪除。對於欄位的刪除可以選擇drop「方法」,其中labels參數用於指定需要刪除的變量名稱,如果是多個變量,則需要將這些變量名稱寫在一對中括號內(如['var1','var2','var3']);刪除變量一定要設置axis參數為1,因為變量個數發生了變化(所以,藉助於axis參數也可以刪除觀測行啦);inplace則表示是否原地修改,即是否直接將原表中的欄位進行刪除,這裡設置為True,如果設置為False,則將刪除變量的預覽效果輸出來,而非真正改變原始數據。

# 刪除觀測,-- 如刪除age變量中所對應的缺失觀測data3_new = data3.drop(labels = data3.index[data3['age'].isnull()], axis = 0)# 查看數據的規模data3_new.shapeout:(2900, 5)

如上結果所示,利用drop「方法」實現了數據行的刪除,但必須將axis參數設置為0,而此時的labels參數則需要指定待刪除的行編號。這裡的行編號是藉助於index「方法」(用於返回原始數據的行編號)和isnull「方法」(用於判斷數據是否為缺失狀態,如果是缺失則返回True)實現的,其邏輯就是將True對應的行編號取出來,傳遞給labels參數。

如果變量的缺失比例非常大,或者缺失行的比例非常小時,使用刪除法是一個不錯的選擇,反之,將會丟失大量的數據信息而得不償失。接下來講解如何使用替換法處理缺失值,代碼如下:

如上結果所示,採用替換法後,原始數據中的變量不再含有缺失值。缺失值的填充使用的是fillna「方法」,其中value參數可以通過字典的形式對不同的變量指定不同的值。需要強調的是,如果計算某個變量的眾數,一定要使用索引技術,例如代碼中的[0],表示取出眾數序列中的第一個(我們知道,眾數是指出現頻次最高的值,假設一個變量中有多個值共享最高頻次,那麼Python將會把這些值以序列的形式存儲起來,故取出指定的眾數值,必須使用索引)。

正如前文所說,雖然替換法思想簡單、效率高效,但是其替換的值往往不具有很高的準確性,於是出現了插補方法。該方法需要使用機器學習算法,不妨以KNN算法為例,對Titanic數據集中的Age變量做插補法完成缺失值的處理。代碼如下:

# 讀取數據titanic = pd.read_csv('Titanic.csv')# 刪除缺失嚴重的Cabin變量titanic.drop(labels='Cabin', axis = 1, inplace=True)# 根據Embarked變量,刪除對應的缺失行titanic.dropna(subset=['Embarked'], inplace=True)# 刪除無關緊要的變量(這些變量對後面預測年齡沒有太多的幫助)titanic.drop(labels=['PassengerId','Name','Ticket','Embarked'], axis = 1, inplace=True)# 將字符型的性別變量映射為數值變量titanic.Sex = titanic.Sex.map({'male':1, 'female':0})# 將數據拆分為兩組,一是年齡缺失組,二是年齡非缺失組,後續基於非缺失值構建KNN模型,再對缺失組做預測nomissing = titanic.loc[~titanic.Age.isnull(),]missing = titanic.loc[titanic.Age.isnull(),]# 導入機器學習的第三方包from sklearn import neighbors# 提取出所有的自變量X = nomissing.columns[nomissing.columns != 'Age']# 構建模型knn = neighbors.KNeighborsRegressor()# 模型擬合knn.fit(nomissing[X], nomissing.Age)# 年齡預測pred_age = knn.predict(missing[X])

相關焦點

  • Python數據清洗(三):異常值識別與處理
    作者 | 劉順祥 來源 | 數據分析1480 在《Python數據清洗(一):類型轉換和冗餘數據刪除》和《Python數據清洗(二):缺失值識別與處理》文中已經講解了有關數據中重複觀測和缺失值的識別與處理,在本節中將分享異常值的判斷和處理方法。
  • 離群值與缺失值的識別與處理
    >在數據處理中,出現離群值和缺失值的情況非常常見。原來咱們在說數據處理的時候也曾經提到過這個情況,這裡,一起再聊聊離群值和缺失值的識別與處理。 離群值的識別與處理離群值(outlier):距離整體數據較遠的數據稱為離群值。沒有搞明白離群值產生的原因之前,不要簡單捨棄,尤其是數據較少的時候。
  • 數據分析|R-缺失值處理
    數據中往往會有各種缺失值,異常值,錯誤值等,今天先介紹一下如何處理缺失值,才能更好的數據分析,更準確高效的建模。一 查看數據集的缺失情況    R中使用NA代表缺失值,用is.na識別缺失值,返回值為TRUE或FALSE。由於邏輯值TRUE和FALSE分別等價於數值1和0,可用sum()和mean()來獲取數據集的缺失情況。
  • 「統計實戰」缺失值識別與處理
    關注我的,分析數據不發愁了不信你試試後臺留言,獲取統計軟體在科學研究中,缺失值通常難以避免,但處理起來又比較麻煩,很多人選擇忽略缺失值,但有些時候它們會不知不覺給我們造成麻煩,學幾招缺失值識別和處理的技術還是很有必要的。
  • 如何使用python技術完成數據集缺失值多種應用場景的濾除或填充?
    比如,我們會用數據分析統計數據集中的缺失值、異常值,更直觀的也會進階到數據可視化的部分(到達該部分一般是成了文章類或匯報類的一部分),然後以統計結果為基礎再對數據進行處理。這個過程往往不是一次性過程,是循環往復的。然後數據處理的結果是有質量的,對後期的數據挖掘、機器學習、深度學習以及其他更多的應用,提供了堅實的基礎。接下來,我們就一起來梳理和總結一下,數據處理過程中,經常遇到的缺失值處理方法。
  • 數據缺失、混亂、重複怎麼辦?最全數據清洗指南讓你所向披靡
    這是一篇如何在 Python 中執行數據清洗的分步指南。在擬合機器學習或統計模型之前,我們通常需要清洗數據。用雜亂數據訓練出的模型無法輸出有意義的結果。數據清洗:從記錄集、表或資料庫中檢測和修正(或刪除)受損或不準確記錄的過程。它識別出數據中不完善、不準確或不相關的部分,並替換、修改或刪除這些髒亂的數據。
  • 數據的預處理基礎:如何處理缺失值
    圖片來源: thermofisher數據集缺少值? 讓我們學習如何處理:數據清理/探索性數據分析階段的主要問題之一是處理缺失值。 缺失值表示未在觀察值中作為變量存儲的數據值。 這個問題在幾乎所有研究中都是常見的,並且可能對可從數據得出的結論產生重大影響。
  • 機器學習基礎:缺失值的處理技巧(附Python代碼)
    在數據分析和建模中,經常會遇到變量值缺失的情況,這是非常常見的。為了保證數據指標的完整性以及可利用性,通常我們會採取特殊的方式對其進行處理。
  • Python數據清洗--類型轉換和冗餘數據刪除
    作者將通過三篇文章,詳細講解工作中常規的數據清洗方法,包括數據類型的轉換,重複數據的處理,缺失值的處理以及異常數據的識別和處理。這是第一篇文章,主要分享的內容包括,文中涉及到的數據可以至文末查看下載連結:數據類型的轉換冗餘數據的識別和處理數據類型的判斷和轉換如下表所示,為某公司用戶的個人信息和交易數據,涉及的欄位為用戶id、性別、年齡、受教育水平、交易金額和交易日期。
  • 機器學習之缺失值處理
    我們先看一部分缺失值數據,以對我們要處理的內容有初步了解缺失值數據圖片比較小,其實這段時間的數據缺失值還是較多的(我是特意找了段缺失值多的數據,方便我們後面對比不同處理方法的結果,嘿嘿~~~),這裡面我們以temp_out欄位為例來進行下面的缺失值處理啦
  • R語言如何檢測和處理數據缺失值?
    面對一份數據,我們會做數據的缺失值檢測和分析,根據數據的缺失程度,以知道數據的完整性和可用性。實際的數據,絕大部分會有缺失值現象。缺失值的產生與諸多因素有關聯,例如:數據採集不成功,數據採集成功了但是數據確實沒有值,數據的值受其它因素控制等。面對有缺失值的數據,我們要怎麼處理、分析和應用,是我們數據工作者要思考和實踐的命題。
  • python數據分析師面試題選
    例舉幾個常用的python分析數據包及其作用數據處理和分析:NumPy, SciPy, Pandas機器學習:SciKit可視化: Matplotlib, Seaborn3.Pandas中使用的標準數據缺失標誌是什麼NaN7. 描述numpy array比python list的優勢a. numpy array比python list更緊湊,存儲數據佔的空間小,讀寫速度快。
  • 樣本缺失值處理,你真的操作對了嗎?
    我在數據清理與探索性分析中遇到的最常見問題之一就是處理缺失數據。首先我們需要明白的是,沒有任何方法能夠完美解決這個問題。不同問題有不同的數據插補方法——時間序列分析,機器學習,回歸模型等等,很難提供通用解決方案。在這篇文章中,我將試著總結最常用的方法,並尋找一個結構化的解決方法。在討論數據插補方法之前,我們必須了解數據丟失的原因。
  • 在python中使用KNN算法處理缺失的數據
    處理缺失的數據並不是一件容易的事。 方法的範圍從簡單的均值插補和觀察值的完全刪除到像MICE這樣的更高級的技術。 解決問題的挑戰性是選擇使用哪種方法。 今天,我們將探索一種簡單但高效的填補缺失數據的方法-KNN算法。KNN代表「 K最近鄰居」,這是一種簡單算法,可根據定義的最接近鄰居數進行預測。
  • Python 數據處理(十六)
    Python 數據處理(十六)10 指定浮點數轉換方法可以在 C 引擎解析期間使用 float_precision 參數來指定浮點數轉換器該參數有三個可選的值:round_trip: 保證文件讀寫之後小數點精度不變In [
  • Kaggle知識點:缺失值處理
    寫在前面在進行數據競賽中,數據預處理階段經常需要對數據進行缺失值處理。關於缺失值的處理並沒有想像中的那麼簡單。以下為一些經驗分享,基本涵蓋了大部分處理方式。這樣做的好處是,D的係數可以被解釋成「在控制了其他變量的情況下,X具缺失數據的個體其Y的預測值減去具X平均數的個體於Y的預測值」缺失值插補相對丟棄而言,補全是更加常用的缺失值處理方式。通過一定的方法將缺失的數據補上,從而形成完整的數據記錄,對於後續的數據處理、分析和建模至關重要。常用的補全方法如下。
  • Python數據清洗80%的工作量,看這篇就夠了
    數據科學家們會花費大量的時間來清理數據集,毫不誇張地說,數據清洗會佔據他們80%的工作時間,而真正用來分析數據的時間只佔到20%左右。 所以,數據清洗到底是在清洗些什麼? 通常來說,你所獲取到的原始數據不能直接用來分析,因為它們會有各種各樣的問題,如包含無效信息,列名不規範、格式不一致,存在重複值,缺失值,異常值等 本文會給大家介紹如何用Python中自帶的Pandas和NumPy庫進行數據清洗。
  • 數據分析之Pandas缺失數據處理
    基礎概念首先,對缺失值分類和缺失值處理方法進行講解。缺失值的分類按照數據缺失機制可分為:可忽略的缺失完全隨機缺失(missing completely at random, MCAR),所缺失的數據發生的概率既與已觀察到的數據無關,也與未觀察到的數據無關隨機缺失(missing at random, MAR),假設缺失數據發生的概率與所觀察到的變量是有關的
  • 機器學習基礎:缺失值的處理技巧
    在數據分析和建模中,經常會遇到變量值缺失的情況,這是非常常見的。為了保證數據指標的完整性以及可利用性,通常我們會採取特殊的方式對其進行處理。 1、缺失查看 首先,需要查看缺失值的缺失數量以及比例(#數據使用的kaggle平臺上預測房價的數據) 柱形圖可視化
  • 數據科學 | 手把手教你用 pandas 索引、匯總和處理缺失數據
    pandas作為python中非常重要的數據處理工具,它提供了很多靈活的數學和統計方法。在數據處理中,經常需要對數據進行索引的轉換,以適應不同的統計和作圖的需要;另外在許多數據分析工作中,缺失數據是經常發生的。因此,作為pandas系列文章的一部分,本文將重點關注pandas對數據索引、匯總和缺失數據的處理的相關方法。