引言
python正迅速成為資料科學家偏愛的語言——這合情合理。它作為一種程式設計語言提供了更廣闊的生态系統和深度的優秀科學計算庫。
在科學計算庫中,我發現pandas對資料科學操作最為有用。pandas,加上scikit-learn提供了資料科學家所需的幾乎全部的工具。本文旨在提供在python中處理資料的12種方法。此外,我還分享了一些讓你工作更便捷的技巧。
在繼續學習之前,我會建議你閱讀一下資料挖掘(data exploration)的代碼。為了幫助你更好地了解,我使用了一個資料集來執行這些資料操作和處理。
資料集:我使用了貸款預測(loan prediction)問題的資料集。請先下載下傳資料集(如果你需要這個資料集,請在評論區聯系我們并請留下電子郵件位址——編者注),然後就可以開始了。
我們開始吧
從導入子產品和加載資料集到python環境這一步開始:
# 1–布爾索引
如果你想根據另一列的條件來篩選某一列的值,你會怎麼做?例如,我們想獲得一份完整的沒有畢業并獲得貸款的女性名單。這裡可以使用布爾索引實作。你可以使用以下代碼:
# 2–apply函數
apply是一個常用函數,用于處理資料和建立新變量。在利用某些函數傳遞一個資料幀的每一行或列之後,apply函數傳回相應的值。該函數可以是系統自帶的,也可以是使用者定義的。舉個例子,它可以用來找到任一行或者列的缺失值。
由此我們得到了需要的結果。
注:第二個輸出中使用了head()函數,因為結果中包含很多行。
# 3–填補缺失值
‘fillna()’可以一次性解決:以整列的平均數或衆數或中位數來替換缺失值。讓我們基于其各自的衆數填補出“性别”、“婚姻”和“自由職業”列的缺失值。
#首先導入函數來判斷衆數
結果傳回衆數和其出現頻次。請注意,衆數可以是一個數組,因為高頻的值可能有多個。我們通常預設使用第一個:
現在,我們可以填補缺失值并用# 2中提到的方法來檢查。
#填補缺失值并再次檢查缺失值以确認
# 4–透視表
pandas可以用來建立ms excel風格的透視表。例如,在本例中一個關鍵列是“貸款數額”有缺失值。我們可以根據“性别”,“婚姻狀況”和“自由職業”分組後的平均金額來替換。 “貸款數額”的各組均值可以以如下方式确定:
# 5–多索引
如果你注意到#3的輸出,它有一個奇怪的特性。每一個索引都是由3個值組合構成的。這就是所謂的多索引。它有助于快速執行運算。
從# 3的例子繼續開始,我們有每個組的均值,但還沒有被填補。
這可以使用到目前為止學習到的各種技巧來解決。
#隻在有缺失貸款值的行中進行疊代并再次檢查确認
注意:
1. 多索引需要在loc中聲明的定義分組的索引元組。這個元組會在函數中用到。
2. .values[0]字尾是必需的,因為預設情況下元素傳回的索引與原資料框的索引不比對。在這種情況下,直接指派會出錯。
# 6. 交叉表
此函數用于擷取資料的一個初始“感覺”(視圖)。在這裡,我們可以驗證一些基本假設。例如,在本例中,“信用記錄”被認為顯著影響貸款狀況。這可以使用交叉表驗證,如下圖所示:
這些是絕對值。但是,要獲得快速的見解,用百分比更直覺。我們可以使用apply 函數來實作:
現在,很明顯,有信用記錄的人得到一筆貸款的可能性更高:與沒有信用記錄的人隻有8%得到貸款相比,80%的有信用記錄的人獲得了一筆貸款。
然而不僅如此。其中包含了更有趣的資訊。由于我已經知道有一次信用記錄是非常重要的,如果我預測擁有信用記錄的人貸款狀态是y(貸款成功),而沒有的人為n(貸款失敗)。令人驚訝的是,我們在614個例子中會有82+378=460次的正确。這個比例高達75%!
如果你仍納悶為何我們還需要統計模型,我不會怪你。但是相信我,即使在目前這個精準度上再提高哪怕0.001%的精度仍會是一項充滿挑戰性的任務。你會接受這個挑戰嗎?
注:這個75%是基于訓練集的。測試集會略有不同,但接近。另外,我希望這能提供一些直覺,即到底為什麼哪怕0.05%的精度提升,可造成kaggle排行榜(資料分析競賽網站——譯者注)上的名次上升500位。
# 7–合并資料幀
當我們需要對不同來源的資訊進行合并時,合并資料幀變得很重要。假設對于不同物業類型,有不同的房屋均價(inr/平方米)。讓我們定義這樣一個資料幀:
現在,我們可以将原始資料幀和這些資訊合并:
透視表驗證了成功的合并操作。請注意,“value”在這裡是無關緊要的,因為在這裡我們隻簡單計數。
# 8–資料幀排序
pandas允許在多列之上輕松排序。可以這樣做:
注:pandas的“排序”功能現在已不再推薦。我們用“sort_values”代替。
# 9–繪圖(箱線圖和柱狀圖)
很多人可能沒意識到,箱線圖和柱狀圖可以直接在pandas中繪制,不必另外調用matplotlib。這隻需要一行指令。例如,如果我們想通過貸款狀況來比較申請人收入的分布,我們可以這樣做:
可見收入本身并不是一個決定性因素, 因為獲得/未獲得貸款的人沒有明顯的收入差異。
# 10–cut函數用于分箱
有時如果數值聚類會更有意義。例如,如果我們試圖用時間(分鐘)對交通狀況(路上的車流量)模組化。相比于如“早晨”“下午”“傍晚”“晚上”“深夜”這樣的時段,具體分鐘數可能對預測交通量不那麼相關。如此對交通模組化會更直覺,也避免過度拟合。
在這裡,我們定義了一個簡單可複用的函數,可以輕松地用于對任何變量的分箱。
# 11–編碼名義變量
有時,我們會遇到必須修改名義變量的類别的情況。這可能是由于以下各種原因:
1. 一些算法(如邏輯回歸)要求所有的輸入都是數值型,是以名義變量常被編碼為0, 1…(n-1)
2. 有時同一個類别可以用兩種方式來表示。如溫度可能被記錄為“high(高)”“medium(中)”“low(低)”“h(高)”“low(低)”。在這裡,無論是“high(高)”還是“h(高)”是指同一類。同理,“low(低)”和“low(低)”也是同一類。但是,python會将它們視為不同分類。
3. 有些類别的頻率可能非常低,把它們歸為一類一般會是個好主意。
在這裡,我定義了一個通用的函數,以字典的方式輸入值,使用pandas中“replace”函數來重新對值進行編碼。
編碼前後計數不變,證明編碼成功。。
# 12–在一個資料幀的行上進行疊代
這不是一個常用的操作。畢竟你不想卡在這裡,是吧?有時你可能需要用for循環疊代所有的行。例如,我們面臨的一個常見問題是在python中對變量的不正确處理。這通常在以下兩種情況下發生:
1. 數值類型的名義變量被視為數值
2. 帶字元的數值變量(由于資料錯誤)被認為是分類變量。
是以手動定義變量類型是一個好主意。如果我們檢查所有列的資料類型:
在這裡,我們看到名義變量“credit_history(信用記錄)”被當做浮點數類型。解決這些問題的一個好方法是建立一個包括列名和類型的csv檔案。這樣,我們就可以定義一個函數來讀取檔案,并指定每一列的資料類型。例如,我在這裡已經建立了一個csv檔案datatypes.csv,如下所示:
加載這個檔案後,我們可以在每一行上進行疊代,以列類型指派資料類型給定義在“type(特征)”列的變量名。
現在的信用記錄列被修改為“object”類型,這在pandas中表示名義變量。
結語
本文中,我們涉及了pandas的不同函數,那是一些能讓我們在探索資料和功能設計上更輕松的函數。同時,我們定義了一些通用函數,可以重複使用以在不同的資料集上達到類似的目的。
原文釋出時間為:2016-04-02
本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号