◆ ◆ ◆引言 Python正迅速成為數(shù)據(jù)科學(xué)家偏愛的語言——這合情合理。它作為一種編程語言提供了更廣闊的生態(tài)系統(tǒng)和深度的優(yōu)秀科學(xué)計算庫,。 在科學(xué)計算庫中,,我發(fā)現(xiàn)Pandas對數(shù)據(jù)科學(xué)操作最為有用。Pandas,,加上Scikit-learn提供了數(shù)據(jù)科學(xué)家所需的幾乎全部的工具,。本文旨在提供在Python中處理數(shù)據(jù)的12種方法。此外,,我還分享了一些讓你工作更便捷的技巧,。 在繼續(xù)學(xué)習(xí)之前,我會建議你閱讀一下數(shù)據(jù)挖掘(data exploration)的代碼,。為了幫助你更好地理解,,我使用了一個數(shù)據(jù)集來執(zhí)行這些數(shù)據(jù)操作和處理。 數(shù)據(jù)集:我使用了貸款預(yù)測(Loan Prediction)問題的數(shù)據(jù)集,。請先下載數(shù)據(jù)集(如果你需要這個數(shù)據(jù)集,,請在評論區(qū)聯(lián)系我們并請留下電子郵件地址——編者注),然后就可以開始了。 ◆ ◆ ◆我們開始吧 從導(dǎo)入模塊和加載數(shù)據(jù)集到Python環(huán)境這一步開始: # 1–布爾索引
如果你想根據(jù)另一列的條件來篩選某一列的值,,你會怎么做,?例如,,我們想獲得一份完整的沒有畢業(yè)并獲得貸款的女性名單,。這里可以使用布爾索引實現(xiàn)。你可以使用以下代碼: # 2–Apply函數(shù) Apply是一個常用函數(shù),,用于處理數(shù)據(jù)和創(chuàng)建新變量,。在利用某些函數(shù)傳遞一個數(shù)據(jù)幀的每一行或列之后,Apply函數(shù)返回相應(yīng)的值,。該函數(shù)可以是系統(tǒng)自帶的,,也可以是用戶定義的。舉個例子,,它可以用來找到任一行或者列的缺失值,。 由此我們得到了需要的結(jié)果。 注:第二個輸出中使用了head()函數(shù),,因為結(jié)果中包含很多行,。 # 3–填補缺失值 ‘fillna()’可以一次性解決:以整列的平均數(shù)或眾數(shù)或中位數(shù)來替換缺失值。讓我們基于其各自的眾數(shù)填補出“性別”,、“婚姻”和“自由職業(yè)”列的缺失值,。
#首先導(dǎo)入函數(shù)來判斷眾數(shù) 結(jié)果返回眾數(shù)和其出現(xiàn)頻次。請注意,,眾數(shù)可以是一個數(shù)組,,因為高頻的值可能有多個。我們通常默認(rèn)使用第一個: 現(xiàn)在,,我們可以填補缺失值并用# 2中提到的方法來檢查,。 #填補缺失值并再次檢查缺失值以確認(rèn) # 4–透視表 Pandas可以用來創(chuàng)建MS Excel風(fēng)格的透視表。例如,,在本例中一個關(guān)鍵列是“貸款數(shù)額”有缺失值,。我們可以根據(jù)“性別”,“婚姻狀況”和“自由職業(yè)”分組后的平均金額來替換,。 “貸款數(shù)額”的各組均值可以以如下方式確定: # 5–多索引 如果你注意到#3的輸出,,它有一個奇怪的特性。每一個索引都是由3個值組合構(gòu)成的,。這就是所謂的多索引,。它有助于快速執(zhí)行運算。 從# 3的例子繼續(xù)開始,,我們有每個組的均值,,但還沒有被填補。 這可以使用到目前為止學(xué)習(xí)到的各種技巧來解決。 #只在有缺失貸款值的行中進行迭代并再次檢查確認(rèn) 注意: 1. 多索引需要在loc中聲明的定義分組的索引元組,。這個元組會在函數(shù)中用到,。 2. .values[0]后綴是必需的,因為默認(rèn)情況下元素返回的索引與原數(shù)據(jù)框的索引不匹配,。在這種情況下,,直接賦值會出錯。 # 6. 交叉表 此函數(shù)用于獲取數(shù)據(jù)的一個初始“感覺”(視圖),。在這里,,我們可以驗證一些基本假設(shè)。例如,,在本例中,,“信用記錄”被認(rèn)為顯著影響貸款狀況。這可以使用交叉表驗證,,如下圖所示: 這些是絕對值,。但是,要獲得快速的見解,,用百分比更直觀,。我們可以使用apply 函數(shù)來實現(xiàn):
現(xiàn)在,很明顯,,有信用記錄的人得到一筆貸款的可能性更高:與沒有信用記錄的人只有8%得到貸款相比,,80%的有信用記錄的人獲得了一筆貸款。 然而不僅如此,。其中包含了更有趣的信息,。由于我已經(jīng)知道有一次信用記錄是非常重要的,如果我預(yù)測擁有信用記錄的人貸款狀態(tài)是Y(貸款成功),,而沒有的人為N(貸款失敗),。令人驚訝的是,我們在614個例子中會有82+378=460次的正確,。這個比例高達75%,! 如果你仍納悶為何我們還需要統(tǒng)計模型,我不會怪你,。但是相信我,,即使在目前這個精準(zhǔn)度上再提高哪怕0.001%的精度仍會是一項充滿挑戰(zhàn)性的任務(wù)。你會接受這個挑戰(zhàn)嗎,? 注:這個75%是基于訓(xùn)練集的,。測試集會略有不同,但接近,。另外,,我希望這能提供一些直覺,,即到底為什么哪怕0.05%的精度提升,可造成Kaggle排行榜(數(shù)據(jù)分析競賽網(wǎng)站——譯者注)上的名次上升500位,。 # 7–合并數(shù)據(jù)幀 當(dāng)我們需要對不同來源的信息進行合并時,,合并數(shù)據(jù)幀變得很重要。假設(shè)對于不同物業(yè)類型,,有不同的房屋均價(INR/平方米),。讓我們定義這樣一個數(shù)據(jù)幀: 現(xiàn)在,我們可以將原始數(shù)據(jù)幀和這些信息合并: 透視表驗證了成功的合并操作,。請注意,,“value”在這里是無關(guān)緊要的,因為在這里我們只簡單計數(shù),。 # 8–數(shù)據(jù)幀排序 Pandas允許在多列之上輕松排序??梢赃@樣做: 注:Pandas的“排序”功能現(xiàn)在已不再推薦,。我們用“sort_values”代替。 # 9–繪圖(箱線圖和柱狀圖) 很多人可能沒意識到,,箱線圖和柱狀圖可以直接在Pandas中繪制,,不必另外調(diào)用matplotlib。這只需要一行命令,。例如,,如果我們想通過貸款狀況來比較申請人收入的分布,我們可以這樣做: 可見收入本身并不是一個決定性因素,, 因為獲得/未獲得貸款的人沒有明顯的收入差異,。 # 10–Cut函數(shù)用于分箱 有時如果數(shù)值聚類會更有意義。例如,,如果我們試圖用時間(分鐘)對交通狀況(路上的車流量)建模,。相比于如“早晨”“下午”“傍晚”“晚上”“深夜”這樣的時段,具體分鐘數(shù)可能對預(yù)測交通量不那么相關(guān),。如此對交通建模會更直觀,,也避免過度擬合。 在這里,,我們定義了一個簡單可復(fù)用的函數(shù),,可以輕松地用于對任何變量的分箱。 # 11–編碼名義變量 有時,,我們會遇到必須修改名義變量的類別的情況,。這可能是由于以下各種原因: 1. 一些算法(如邏輯回歸)要求所有的輸入都是數(shù)值型,因此名義變量常被編碼為0, 1…(n-1) 2. 有時同一個類別可以用兩種方式來表示,。如溫度可能被記錄為“High(高)”“Medium(中)”“Low(低)”“H(高)”“l(fā)ow(低)”,。在這里,無論是“High(高)”還是“H(高)”是指同一類。同理,,“Low(低)”和“l(fā)ow(低)”也是同一類,。但是,Python會將它們視為不同分類,。 3. 有些類別的頻率可能非常低,,把它們歸為一類一般會是個好主意。 在這里,,我定義了一個通用的函數(shù),,以字典的方式輸入值,使用Pandas中“replace”函數(shù)來重新對值進行編碼,。
編碼前后計數(shù)不變,,證明編碼成功。,。 # 12–在一個數(shù)據(jù)幀的行上進行迭代 這不是一個常用的操作,。畢竟你不想卡在這里,是吧,?有時你可能需要用for循環(huán)迭代所有的行,。例如,我們面臨的一個常見問題是在Python中對變量的不正確處理,。這通常在以下兩種情況下發(fā)生: 1. 數(shù)值類型的名義變量被視為數(shù)值 2. 帶字符的數(shù)值變量(由于數(shù)據(jù)錯誤)被認(rèn)為是分類變量,。 所以手動定義變量類型是一個好主意。如果我們檢查所有列的數(shù)據(jù)類型: 在這里,,我們看到名義變量“Credit_History(信用記錄)”被當(dāng)做浮點數(shù)類型,。解決這些問題的一個好方法是創(chuàng)建一個包括列名和類型的CSV文件。這樣,,我們就可以定義一個函數(shù)來讀取文件,,并指定每一列的數(shù)據(jù)類型。例如,,我在這里已經(jīng)創(chuàng)建了一個CSV文件datatypes.csv,,如下所示: 加載這個文件后,我們可以在每一行上進行迭代,,以列類型指派數(shù)據(jù)類型給定義在“type(特征)”列的變量名,。 現(xiàn)在的信用記錄列被修改為“object”類型,這在Pandas中表示名義變量,。 ,、◆ ◆ ◆結(jié)語 本文中,我們涉及了Pandas的不同函數(shù),,那是一些能讓我們在探索數(shù)據(jù)和功能設(shè)計上更輕松的函數(shù),。同時,,我們定義了一些通用函數(shù),可以重復(fù)使用以在不同的數(shù)據(jù)集上達到類似的目的,。 |
|