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

2020-12-05 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數據清洗(二):缺失值識別與處理》文中已經講解了有關數據中重複觀測和缺失值的識別與處理,在本節中將分享異常值的判斷和處理方法。
  • 數據的預處理基礎:如何處理缺失值
    圖片來源: thermofisher數據集缺少值? 讓我們學習如何處理:數據清理/探索性數據分析階段的主要問題之一是處理缺失值。 缺失值表示未在觀察值中作為變量存儲的數據值。 這個問題在幾乎所有研究中都是常見的,並且可能對可從數據得出的結論產生重大影響。
  • 在python中使用KNN算法處理缺失的數據
    處理缺失的數據並不是一件容易的事。 方法的範圍從簡單的均值插補和觀察值的完全刪除到像MICE這樣的更高級的技術。 解決問題的挑戰性是選擇使用哪種方法。 今天,我們將探索一種簡單但高效的填補缺失數據的方法-KNN算法。KNN代表「 K最近鄰居」,這是一種簡單算法,可根據定義的最接近鄰居數進行預測。 它計算從您要分類的實例到訓練集中其他所有實例的距離。
  • 使用Python預測缺失值
    對於數據科學家來說,處理丟失的數據是數據清理和模型開發過程中的一個重要部分。通常情況下,真實數據包含多個稀疏欄位或包含錯誤值的欄位。在這篇文章中,我們將討論如何建立可以用來填補數據中缺失或錯誤值的模型。
  • 數據清洗在新能源功率預測中的研究綜述和展望
    目前針對新能源功率預測的數據預處理方面的綜述較少,因此有必要對新能源功率預測背景下的數據清洗方法進行綜述和展望。本文從異常值剔除和缺失值重構兩個方面,詳細地闡述、分析和歸納了新能源異常數據的類別和清洗方法。最後對數據清洗在新能源功率預測中需要進一步研究的方向進行了展望。
  • 第五十三講 R-缺失值的注意事項及處理
    在數據分析過程中,我們經常會遇到缺失值的情況。比如要研究血壓、血糖、胰島素水平、懷孕次數與糖尿病的關係。我們需要使用多元邏輯回歸。但是可能數據有10%的血壓確實,10%的胰島素水平缺失,10%的血糖缺失。
  • python|圖像識別
    影響力之大和最吸引人的技術就是圖像識別,圖像識別技術是人工智慧的一個重要領域,它是指利用計算機對圖像進行處理、分析和理解,以識別各種不同模式的目標和對象的技術。今天以女神宋慧喬的兩張不同照片為例,利用python識別其相似度,從而判定是否是同一人,同時讓我們對圖像識別有個初步的了解,什麼?照片可以換蒼老師和波老師嗎?我懷疑你們在開車,可是我沒有證據!
  • Python驗證碼識別:利用pytesser識別簡單圖形驗證碼
    計算機涉及到的幾何圖形處理一般有 2維到n維圖形處理,邊界區分,面積計算,體積計算,扭曲變形校正。對於顏色則有色彩空間的計算與轉換,圖形上色,陰影,色差處理等等。在破解驗證碼中需要用到的知識一般是 像素,線,面等基本2維圖形元素的處理和色差分析。
  • mac使用python識別圖形驗證碼!
    接下來就是安裝python相關的包安裝python所需要的包pip3 install pytesseractpip3 install pillow安裝pytesseract是ocr識別圖片上的字,因為驗證碼的識別難度高低不同,所以在這個過程中需要對圖片做一定的處理,這就需要使用處理圖片的模塊pillow。
  • 數據工程師需要掌握的 18 個 Python 庫
    目錄數據獲取SeleniumScrapyBeautiful Soup數據清洗SpacyNumPyPandas數據可視化MatplotlibPyecharts數據建模Scikit-learnPyTorchTensorFlow模型檢查Lime音頻數據處理Librosa圖像數據處理OpenCV-PythonScikit-image數據通信Pymongo數據分析結果web部署FlaskDjango
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    二、課程目標 通過課程學習,可以理解機器學習的思維方式和關鍵技術;了解深度學習和機器學習在當前工業界的落地應用;能夠根據數據分布選擇合適的算法模型並書寫代碼,初步勝任使用Python進行數據挖掘、機器學習、深度學習等工作。
  • 2020 版 Python 數據清理終極指南!
    現在可以查看一下「dirty」數據類型的列表,然後逐個進行修復。讓我們馬上開始。缺失的數據處理缺失的數據是數據清理中最棘手但也是最常見的一種情況。雖然許多模型可以適應各種各樣的情況,但大多數模型都不接受數據的缺失。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    如何使用生成器函數實現迭代對象.MOV 2-4 5切片操作.mov 9-6迭代多個對象.MOV 4-1拆分字符串.MOV 4-2 3調整字符串中文格式.mov 4-4小字符串拼接.mov 4-5 字符串居中對齊.mov 4-6 去掉不需要的字符.mov 5-1 如何讀取文本文件.mov 5-2如何處理二進位文件
  • Python程序圖片和pdf上文字識別實例一二
    處理方式就是:1、將圖片的顏色模式轉成灰度模式,再用OTSU做二值化處理2、將處理結果保存成臨時圖片文件3、調用pytesseract識別臨時圖片上的文字,識別完畢後刪掉臨時圖片選擇要識別文字的圖片調用tkinter打開圖形化對話窗口,tkinter是python內置模塊,可直接引進不必安裝。
  • 驗證碼識別實例,python簡單圖像處理和實現
    基本識別原理概述:1、每一幅圖像在構成上,都是由一個個像素組成的矩陣,每一個像素為單元格。2、 彩色圖像的像素的由三原色(紅,綠,藍)構成元組,灰度圖像的像素是一個單值,每個像素的值範圍為(0,255)。
  • 基於python+OpenCV模塊的人臉識別定位技術
    本文將基於OpenCV模塊,在windows作業系統上,利用python語言,進行人臉識別技術的研究。當然OpenCV的應用領域很廣,除了人臉識別之外,它還支持圖像分割、動作識別、視頻處理等技術。代碼的第3行(以上圖為準,空行也算一行),導入別人已經訓練好的臉部識別資料庫。這裡用到的數據是在github上開源的已經訓練好的分類器,如圖所示:需要將對應的數據文件(.xml文件)下載到指定目錄(代碼中的示例,展示的是與.py文件同一目錄下)。第4行的函數cv2.VideoCapture(0)表示調用相機。第6行是讀取攝像機中的影像。
  • 多重插補法處理缺失數據(缺失值)
    同時,我們還將以最新發表、或各學科Top期刊文章中的統計方法為例,給大家逐一講解如何做統計(分析數據)!介 紹做科學研究的時候,我們經常會碰到缺失值的問題,除了直接刪除、簡單插補,多重插補也是常用到的處理缺失數據的方法。使用軟體使用軟體:SPSS 25.0,建議使用高版本。
  • 用python識別驗證碼
    今天,我們就簡單的說下,怎麼用python來處理驗證碼。(注意:我所有的python相關的文章用的都是python3。)準備工作1、tesseract-ocr軟體Tesseract的OCR引擎最先由HP實驗室於1985年開始研發,至1995年時已經成為OCR業內最準確的三款識別引擎之一。然而,HP不久便決定放棄OCR業務,Tesseract也從此塵封。
  • Python和人工智慧有什麼關係?Python 和人工智慧的區別是什麼?
    人工智慧人工智慧是一個大的概念,在人工智慧下有計算機視覺,語音識別,自然語言處理等不同的技術領域,這些技術領域中在Github上又有許多開源的代碼可以直接用來開發,而這些代碼往往需要或者只支持Python進行調用。
  • 使用Python和Tesseract來識別圖形驗證碼
    一、關於圖形驗證碼識別與tesseractOCR儘管多數圖型驗證碼只有區區幾個數字或字母,但你可能聽說了,在進行機器識別的過程中,你要收集樣本,對圖片去噪、二值化、提取字符、計算特徵,甚至還要祭出神經網絡去訓練數據進行機器學習……還沒開幹,退堂鼓早打響三遍了。