使用pandas進行資料清洗
轉載出處:http://www.cnblogs.com/stream886/p/6021743.html
目錄:
- 資料表中的重複值
- duplicated()
- drop_duplicated()
- 資料表中的空值/缺失值
- isnull()¬null()
- dropna()
- fillna()
- 資料間的空格
- 檢視資料中的空格
- 去除資料中的空格
- 大小寫轉換
- 更改資料格式
- astype()
- to_datetime()
- 資料分組
- cut()
- 資料分列
- split()
資料清洗是一項複雜且繁瑣(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[ |