1. 程式人生 > >pandas(資料框部分04)

pandas(資料框部分04)

上一期我們使用pandas模組實現頻數統計、缺失值處理、資料對映和資料彙總 4個知識點,這期我們再來聊聊關於pandas如何實現資料合併 、資料連線 、建立啞變數和連續數值的區間化的操作。前兩個操作在資料庫中是非常常用的,即將多個數據集縱向合併和橫向的擴充套件;後兩個操作在資料建模中會經常用到,即離散變數的啞變數化處理和連續變數的分段處理。

一、資料集的縱向合併

如果你手中有多張資料結構一致的excel表格,你需要將這些表格合併到一起,你會怎麼做?複製貼上?是不是太慢了,這裡教你使用Python完成資料的批量合併。

例如,我的D盤中有這些個結構一致的excel表格:

可以通過如下的Python程式碼完成資料的堆疊


,pd.concat函式的第一個引數一定要是一個可迭代物件。故在程式碼中對dataframe初始化為列表結構。

結果如下:


我們看看R語言的環境下,是如何完成資料集的縱向合併:


結果如下:


二、資料集的橫向擴充套件

如果你所需的資料集來自於多張表,而這些表之間存在一些公共的欄位用於觀測行的匹配,換句話說,你需要在excel使用vlookup這樣的函式完成資料的連線。要想實現該功能,在Python中應該如何實現呢?

先來看一下需要join的資料長啥樣:


接下來,藉助於pandas中merge函式完成兩個資料集的連線,即將economy_info表中的欄位合併到user_info表中,形成一張寬表。

我們先來看一下merge函式的幾個重要的引數:

pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, 
left_index=False, right_index=False, sort=False,
suffixes=('_x', '_y'), copy=True, indicator=False)

left,right:為需要連線的兩張表;
how:預設對兩張表進行內連,'right','left'為右連和左連,一般inner和left使用最多;
on:指定關連兩張表的公共欄位;
left_on,right_on:指定left表和right表中需要關連的欄位;
left_index,right_index:指定left表和right表中需要關連的行索引


結果如下:


如果你的兩張表有公共欄位,而且欄位名稱完全一致,merge函式會自動查詢這些欄位,並以這些欄位作為連線的依據。如果兩張表中含公共欄位,但名稱不一致,如Id與id,這個時候就需要left_on和right_on兩個引數的使用了。


結果如下:


發現表中含有兩個id,這個時候需要你手工再刪除一下,可以通過drop函式刪除其中一個變數。關於變數的刪除你可以參考這篇文章:

R語言也同樣可以完成這部分工作,只需要藉助於dplyr包即可,具體操作如下:


結果如下:


三、離散變數的啞變數處理

在建模過程中,往往會有一些離散變數,如學歷、收入等級,使用者會員等級。這些變數直接放入到模型中(如迴歸模型)是有問題的(即使你已經用1,2,3...等資料表示),為解決這個問題,我們通常是將這些變數進行啞變數處理。如果離散變數有N種水平,就需要構造N-1個變數,每一個變數均用0和1的值來表示。那這樣的0-1編碼,如何使用Python來實現呢?如果你使用了pandas模組中的get_dummies函式,問題就會顯得非常容易。下面我們舉例說明:


該資料集中的gender變數和level變數都屬於離散變數,需要將這兩個變數進行啞變數處理。

結果如下:


是不是很方便。千萬記得,如果你的變數進行了啞變數處理,建模時要記得刪除原離散變數中的某一個水平,如性別中刪除gender_F,等級中刪除level_V1。刪除的變數,就表示性別中,以女性(F)為參照組;等級中,以V1為參照組。如下是變數的刪除:


在R語言中,也有與此功能一致的啞變數處理函式(dummyVars),該函式的呼叫需要下載caret包,該包有非常強大的資料清洗功能,感興趣的讀者可以閱讀這兩篇文章:


結果如下:


注意,這個只是含有所有啞變數的資料集,並不包含其他連續變數,如id,age變數。故還要通過cbind函式將兩個資料集合並起來。

結果如下:


刪除某個啞

四、連續變數的分段

最後,再來看一個知識點,那就是需要把連續變數進行分段處理,如年齡需要分成未成年、青年、中年和老年;收入需要分成低收入群體、中等收入群體和高收入群體,資料中類似這樣的問題還是蠻多的,如何把這些連續資料進行分段處理呢?看看Python是如何達到目的的:

這裡我們隨機生成一列資料表示年齡


假如18歲以下為未成年;18~45歲為青年;45~60歲為中年;60歲以上為老年,接下來就根據這些閾值把年齡分為4段。

結果如下:


圖中right引數設定為False,表示分段的資料區間不包含上限

原始年齡資料如下,檢視與分段的年齡組對比:


同樣的問題,看看R語言是如何解決的:

結果如下:


雖然cut2函式把資料集切割成了4段,但返回的結果是區間表示,我們還需要通過因子函式,再將這些區間表示轉換成明確的含義。


今天我們的內容就介紹到這邊,歡迎大家交流與拍磚。下期我們來分享一些Python的視覺化方面的知識點。

每天進步一點點2015

學習與分享,取長補短,關注小號!


長按識別二維碼馬上關注