1. 程式人生 > >使用pandas進行資料清洗

使用pandas進行資料清洗

轉載出處:http://www.cnblogs.com/stream886/p/6021743.html

目錄:

 資料清洗是一項複雜且繁瑣(kubi)的工作,同時也是整個資料分析過程中最為重要的環節。有人說一個分析專案80%的時間都是在清洗資料,這聽起來有些匪夷所思,但在實際的工作中確實如此。資料清洗的目的有兩個,第一是通過清洗讓資料可用。第二是讓資料變的更適合進行後續的分析工作。換句話說就是有”髒”資料要洗,乾淨的資料也要洗。本篇文章將介紹幾種簡單的使用python進行資料清洗的方法。

開始之前還是先在python中匯入需要使用的庫檔案,然後進行資料讀取,並建立名為loandata的資料表。這裡為了更好的展示清洗的步驟和結果,我們使用的是lendingclub公開資料中的一小部分。

1 2 3 import numpy as np import pandas as pd loandata=pd.DataFrame(pd.read_excel('loandata.xlsx'))

資料清洗的目的有兩個,第一是通過清洗讓髒資料變的可用。這也是我們首先要解決的問題。無論是線下人工填寫的手工表,還是線上通過工具收集到的資料,又或者是CRM系統中匯出的資料。很多資料來源都有一些這樣或者那樣的問題,例如:資料中的重複值,異常值,空值,以及多餘的空格和大小寫錯誤的問題。下面我們逐一進行處理。

資料表中的重複值

第一個要處理的問題是資料表中的重複值,pandas中有兩個函式是專門用來處理重複值的,第一個是duplicated函式。Duplicated函式用來查詢並顯示資料表中的重複值。下面是使用這個函式對資料表進行重複值查詢後的結果。

1 loandata.duplicated()


這裡有兩點需要說明:第一,資料表中兩個條目間所有列的內容都相等時duplicated才會判斷為重複值。(Duplicated也可以單獨對某一列進行重複值判斷)。第二,duplicated支援從前向後(first),和從後向前(last)兩種重複值查詢模式。預設是從前向後進行重複值的查詢和判斷。換句話說就是將後出現的相同條件判斷為重複值。在前面的表格中索引為4的1311748和索引為1的條目相同。預設情況下後面的條目在重複值判斷中顯示為True。

Pandas中的drop_duplicates函式用來刪除資料表中的重複值,判斷標準和邏輯與duplicated函式一樣。使用drop_duplicates函式後,python將返回一個只包含唯一值的資料表。下面是使用drop_duplicates函式後的結果。與原始資料相比減少了3行,仔細觀察可以發現,drop_duplicates預設也是使用了first模式刪除了索引為4的重複值,以及後面的另外兩個重複值。

1 loandata.drop_duplicates()

資料表中的空值/缺失值

第二個要處理的問題是資料表中的空值,在python中空值被顯示為NaN。在處理空值之前我們先來檢查下資料表中的空值數量。對於一個小的資料表,我們可以人工查詢,但對於較為龐大的資料表,就需要尋找一個更為方便快捷的方法了。首先,對關鍵欄位進行空值查詢。這裡我們分別選擇了對loan_amnt欄位和annual_inc欄位查詢空值。

Pandas中查詢資料表中空值的函式有兩個,一個是函式isnull,如果是空值就顯示True。另一個函式notnull正好相反,如果是空值就顯示False。以下兩個函式的使用方法以及通過isnull函式獲得的空值數量。

1 loandata.isnull()
1 loandata.notnull()

通過isnull函式和value_counts函式分別獲得了loan_amnt列和annual_inc列中的空值資料量。


對於空值有兩種處理的方法,第一種是使用fillna函式對空值進行填充,可以選擇填充0值或者其他任意值。第二種方法是使用dropna函式直接將包含空值的資料刪除。

1 loandata.fillna(0)
1 loandata.dropna()

這裡我們選擇對空值資料進行填充,首先處理loan_amnt列中的空值。通過totalpymnt欄位和total_tec_int欄位值相減計算出loan_amnt列中的近似值。因為這裡除了利息以外還可能包括一些逾期費,手續費和罰息等,所以只能獲得一個實際貸款金額近似值。由於貸款金額通常是一個整數,因此我們在程式碼的最後對格式進行了轉換。

1 loandata['loan_amnt']=loandata['loan_amnt'].fillna(loandata[