吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

zhKF_jqr_AI ? 來源:未知 ? 作者:易水寒 ? 2018-05-19 11:40 ? 次閱讀

編者按:依靠完善的編程語言生態(tài)系統(tǒng)和更好的科學計算庫,如今Python幾乎已經(jīng)成了數(shù)據(jù)科學家的首選語言。如果你正開始學習Python,而且目標是數(shù)據(jù)分析,相信NumPy、SciPy、Pandas會是你進階路上的必備法寶。尤其是對數(shù)學專業(yè)的人來說,Pandas可以作為一個首選的數(shù)據(jù)分析切入點。

本文將介紹12種用于數(shù)據(jù)分析的Pandas技巧,為了更好地描述它們的效果,這里我們用一個數(shù)據(jù)集輔助進行操作。

數(shù)據(jù)集:我們研究的主題是貸款預測,請到datahack.analyticsvidhya.com/contest/practice-problem-loan-prediction下載數(shù)據(jù)(需注冊),并開始學習之旅。

預備!開始!

首先,我們先導入模塊,并將數(shù)據(jù)集加載到Python環(huán)境中:

import pandas as pd

import numpy as np

data = pd.read_csv("train.csv", index_col="Loan_ID")

1. Boolean Indexing

在表格中,如果你想根據(jù)另一列的條件篩選當前列的值,你會怎么做?舉個例子,假設我們想要一份所有未畢業(yè)但已經(jīng)辦理了貸款的女性清單,具體的操作是什么?在這種情況下,Boolean Indexing,也就是布爾索引能提供相應的功能。我們只需這樣做:

data.loc[(data["Gender"]=="Female") & (data["Education"]=="Not Graduate") & (data["Loan_Status"]=="Y"), ["Gender","Education","Loan_Status"]]

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

2. Apply Function

Apply函數(shù)是使用數(shù)據(jù)和創(chuàng)建新變量的常用函數(shù)之一。在對DataFrame的特定行/列應用一些函數(shù)后,它會返回相應的值。這些函數(shù)既可以是默認的,也可以是用戶自定義的。如這里我們就定義了一個查找每行/列中缺失值的函數(shù):

#Create a new function:

def num_missing(x):

return sum(x.isnull())

#Applying per column:

print"Missing values per column:"

print data.apply(num_missing, axis=0) #axis=0 defines that function is to be applied on each column

#Applying per row:

print" Missing values per row:"

print data.apply(num_missing, axis=1).head() #axis=1 defines that function is to be applied on each row

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

我們得到了預期的結果。需要注意的一點是,這里head() 函數(shù)只作用于第二個輸出,因為它包含多行數(shù)據(jù)。

3. 替換缺失值

對于替換缺失值,fillna()可以一步到位。它會用目標列的平均值/眾數(shù)/中位數(shù)更新缺失值,以此達到目的。在這個示例中,讓我們用眾數(shù)分別更新Gender、Married、Self_Employed這幾列的缺失值:

#First we import a function to determine the mode

from scipy.stats import mode

mode(data['Gender'])

輸出:

ModeResult(mode=array([‘Male’], dtype=object), count=array([489]))

我們得到了眾數(shù)及其出現(xiàn)的次數(shù)。記住很多時候眾數(shù)會是一個數(shù)組,因為可能數(shù)據(jù)中存在多個高頻詞,默認情況下,我們會選擇第一個:

mode(data['Gender']).mode[0]

*‘Male’

現(xiàn)在我們就能更新缺失值,并檢測自己對Apply函數(shù)的掌握情況:

#Impute the values:

data['Gender'].fillna(mode(data['Gender']).mode[0], inplace=True)

data['Married'].fillna(mode(data['Married']).mode[0], inplace=True)

data['Self_Employed'].fillna(mode(data['Self_Employed']).mode[0], inplace=True)

#Now check the #missing values again to confirm:

print data.apply(num_missing, axis=0)

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

從結果上看,缺失值的確被補上了,但這只是最原始的形式,在現(xiàn)實工作中,我們還要掌握更復雜的方法,如分組使用平均值/眾數(shù)/中位數(shù)、對缺失值進行建模等。

4. Pivot Table

Pandas可以用來創(chuàng)建MS Excel樣式數(shù)據(jù)透視表(Pivot Table)。在本文的例子中,數(shù)據(jù)的關鍵列是含有缺失值的“LoanAmount”。為了獲得具體的貸款額度數(shù)字,我們可以用Gender、Married、Self_Employed這幾列的貸款情況進行估算:

#Determine pivot table

impute_grps = data.pivot_table(values=["LoanAmount"], index=["Gender","Married","Self_Employed"], aggfunc=np.mean)

print impute_grps

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

5. Multi-Indexing

如果你仔細觀察了“替換缺失值”那一節(jié)的輸出,你可能會發(fā)現(xiàn)一個奇怪的現(xiàn)象,就是每個索引都由3個值組合而成。這被稱為多重索引(Multi-Indexing),它有助于操作的快速執(zhí)行。

讓我們接著這個例子,假設現(xiàn)在我們有各列的值,但還沒有進行缺失值估算。這時就要用到之前的各種技巧:

#iterate only through rows with missing LoanAmount

for i,row in data.loc[data['LoanAmount'].isnull(),:].iterrows():

ind = tuple([row['Gender'],row['Married'],row['Self_Employed']])

data.loc[i,'LoanAmount'] = impute_grps.loc[ind].values[0]

#Now check the #missing values again to confirm:

print data.apply(num_missing, axis=0)

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

注:

多索引需要元組來定義loc語句中的索引組。這是一個在函數(shù)中要用到的元組。

values [0]的后綴是必需的,因為默認情況下返回的值與DataFrame的值不匹配。在這種情況下,直接分配會出現(xiàn)錯誤。

6. Crosstab

這個函數(shù)可以被用來塑造對數(shù)據(jù)的初始“感覺(概覽)”,通俗地講,就是我們可以驗證一些基本假設,如在貸款案例中,“Credit_History”會影響個人貸款成功與否。這可以用交叉表(Crosstab)測試,如下所示:

pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True)

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

如果說數(shù)值還不夠直觀,我們可以用apply函數(shù)把它轉換成百分比:

def percConvert(ser):

return ser/float(ser[-1])

pd.crosstab(data["Credit_History"],data["Loan_Status"],margins=True).apply(percConvert, axis=1)

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

顯然,有“CreditHistory”的人獲得貸款的機會更大,有80%以上的概率,而沒有“CreditHistory”的人獲得貸款的概率只有可憐的9%。

但是這就是個簡單的預測結果嗎?不是的,這里包含著一個有趣的故事。已知有CreditHistory”的人獲得貸款的概率更高,那我們大可以設他們的“LoanStatus”為Y,其他人的為N,這樣一個模型的預測結果會是什么樣的?我們進行了614次測試,而它的正確預測次數(shù)是82+378=460,75%的準確率!

也許你會吐槽這么個問題為什么要扯到統(tǒng)計模型。我不否認,但我只想說明一點,就是如果你能把這個模型的準確率再提升哪怕0.001%,這都是個巨大的突破。

注:這里的75%是個大概的值,具體數(shù)字在訓練集和測試集上有所不同。我希望這能直觀地解釋為什么在Kaggle這樣的比賽中,0.05%的準確率提升能帶來500名以上的排名提升。

7. 合并DataFrame

當我們需要將來自不同來源的信息進行整合時,合并DataFrame(或者你們愛說數(shù)據(jù)框)就變得很重要了。現(xiàn)在房價很熱,炒房團也很熱,所以我們先用數(shù)據(jù)集的數(shù)據(jù)假設一份各地區(qū)房屋均價(1平)不同的表:

prop_rates = pd.DataFrame([1000,5000,12000],index = ['Rural','Semiurban','Urban'],columns = ['rates'])

prop_rates

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

現(xiàn)在我們可以將這些信息與原始DataFrame合并為:

data_merged = data.merge(right=prop_rates, how='inner',left_on='Property_Area',right_index=True, sort=False)

data_merged.pivot_table(values='Credit_History',index=['Property_Area','rates'], aggfunc=len)

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

反正買不起,好了,數(shù)據(jù)合并成功了。請注意,'values'參數(shù)在這里是沒什么用的,因為我們只是做計數(shù)。

8. DataFrame排序

Pandas可以輕松基于多列進行排序,如下所示

data_sorted = data.sort_values(['ApplicantIncome','CoapplicantIncome'], ascending=False)

data_sorted[['ApplicantIncome','CoapplicantIncome']].head(10)

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

注:Pandas的sort函數(shù)已經(jīng)不能用了,現(xiàn)在排序要調(diào)用sort_value。

9. 繪圖(Boxplot和直方圖)

很多人可能不知道自己能直接在Pandas里繪制盒形圖和直方圖,無需單獨調(diào)用matplotlib,一行命令就能搞定。例如,如果我們想比較Loan_Status的ApplicantIncome的分布情況:

import matplotlib.pyplot as plt

%matplotlib inline

data.boxplot(column="ApplicantIncome",by="Loan_Status")

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

data.hist(column="ApplicantIncome",by="Loan_Status",bins=30)

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

這兩幅圖表明收入在貸款過程中所占的比重并沒有我們想象中那么高,無論是被拒的還是收到貸款的,他們的收入沒有非常明顯的區(qū)別。

10. Cut function for binning

有時候聚類后的數(shù)據(jù)會更有意義。以今天最近車禍頻發(fā)的自動駕駛汽車為例,如果我們要用它捕獲的數(shù)據(jù)重現(xiàn)某條路上的交通情況,比起一整天的流暢數(shù)據(jù),或是把一天均勻分割為24個小時,“早上”“下午”“晚上”“夜晚”“深夜”這幾個關鍵時段的數(shù)據(jù)包含的信息量更多,也更有效。如果我們用這些數(shù)據(jù)建模,它的成果會更直觀,而且可以避免過擬合。

這里我們定義一個簡單的函數(shù),它可以高效binning:

#Binning:

def binning(col, cut_points, labels=None):

#Define min and max values:

minval = col.min()

maxval = col.max()

#create list by adding min and max to cut_points

break_points = [minval] + cut_points + [maxval]

#if no labels provided, use default labels 0 ... (n-1)

ifnot labels:

labels = range(len(cut_points)+1)

#Binning using cut function of pandas

colBin = pd.cut(col,bins=break_points,labels=labels,include_lowest=True)

return colBin

#Binning age:

cut_points = [90,140,190]

labels = ["low","medium","high","very high"]

data["LoanAmount_Bin"] = binning(data["LoanAmount"], cut_points, labels)

print pd.value_counts(data["LoanAmount_Bin"], sort=False)

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

11. 為nominal數(shù)據(jù)編碼

有時候我們需要對稱名數(shù)據(jù)(nominal數(shù)據(jù))重新分類,這可能是由于各種原因造成的:

一些算法(如Logistic回歸)要求所有輸入都是數(shù)字,所以我們要把稱名變量重新編碼為0,1 ...(n-1)。

有時一個類別可能包含多種表達,如“溫度”可以被記錄為“High”“Medium”“Low”“H”“l(fā)ow”,其中“High”和“H”是一碼事,“Low”和“l(fā)ow”也是一碼事,但Python會認為它們是不同的。

有些類別的頻數(shù)非常低,所以我們應該把它們合并起來。

為了解決這個問題,這里我們定義了一個簡單的函數(shù),它把輸入作為“字典”,然后調(diào)用Pandas的replace函數(shù)重新編碼:

#Define a generic function using Pandas replace function

def coding(col, codeDict):

colCoded = pd.Series(col, copy=True)

for key, value in codeDict.items():

colCoded.replace(key, value, inplace=True)

return colCoded

#Coding LoanStatus as Y=1, N=0:

print'Before Coding:'

print pd.value_counts(data["Loan_Status"])

data["Loan_Status_Coded"] = coding(data["Loan_Status"], {'N':0,'Y':1})

print' After Coding:'

print pd.value_counts(data["Loan_Status_Coded"])

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

12. 迭代dataframe的行

這不是一個常用的技巧,但如果遇到這種問題,相信沒人想到時候再絞盡腦汁想辦法,或者直接自暴自棄用for循環(huán)遍歷所有行。這里我們舉兩個要用到這種方法的場景:

當帶有數(shù)字的nominal variable被當成數(shù)字。

當某一行帶有字符(因為數(shù)據(jù)錯誤)的Numeric variable被當成分類。

這時我們就要手動定義列的類別。雖然很麻煩,但這之后如果我們再檢查數(shù)據(jù)類別:

#Check current type:

data.dtypes

它的輸出會是:

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

這里我們看到Credit_History是一個稱名變量,但是它卻顯示為float。解決這些問題的一個好方法是創(chuàng)建一個包含列名和類型的csv文件,有了它,我們就可以創(chuàng)建一個函數(shù)來讀取文件并分配列數(shù)據(jù)類型。

#Load the file:

colTypes = pd.read_csv('datatypes.csv')

print colTypes

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

加載這個文件后,我們可以遍歷每一行,并使用'type'列將數(shù)據(jù)類型賦值給'feature'列中定義的變量名稱。

#Iterate through each row and assign variable type.

#Note: astype is used to assign types

for i, row in colTypes.iterrows(): #i: dataframe index; row: each row in series format

if row['type']=="categorical":

data[row['feature']]=data[row['feature']].astype(np.object)

elif row['type']=="continuous":

data[row['feature']]=data[row['feature']].astype(np.float)

print data.dtypes

12種用于數(shù)據(jù)分析的Pandas技巧可用來學習Python詳細概述

希望本文對你有用!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 函數(shù)
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62971
  • 數(shù)據(jù)分析

    關注

    2

    文章

    1461

    瀏覽量

    34165
  • python
    +關注

    關注

    56

    文章

    4807

    瀏覽量

    85037

原文標題:12種用于Python數(shù)據(jù)分析的Pandas技巧

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    python數(shù)據(jù)分析的類庫

    學運算及對數(shù)組執(zhí)行元素級計算的函數(shù);3).用于讀寫硬盤上基于數(shù)組的數(shù)據(jù)集的工具;4).線性代數(shù)運算、傅里葉變換,以及隨機數(shù)生成。2.Pandas大名鼎鼎的Pandas可以說只要做
    發(fā)表于 05-10 15:18

    怎么有效學習Python數(shù)據(jù)分析

    Python在人工智能、機器學習領域受到火熱追捧,很大程度上在于它擁有非常龐大的第三方庫,以及強大的通用編程性能。因此,快速掌握Python進行數(shù)據(jù)分析,就是
    發(fā)表于 06-28 15:18

    pandas數(shù)據(jù)分析的方法

    pandas數(shù)據(jù)分析中常用方法
    發(fā)表于 06-03 06:16

    pandas數(shù)據(jù)分析常見操作

    數(shù)據(jù)分析-pandas數(shù)據(jù)處理清洗常用總結
    發(fā)表于 08-08 06:46

    pandas對babynames數(shù)據(jù)集的簡單處理

    利用Python進行數(shù)據(jù)分析——第二章 引言(2):利用pandas對babynames數(shù)據(jù)集進行簡單處理
    發(fā)表于 08-09 12:58

    python 數(shù)據(jù)分析基礎 day12-python調(diào)用mysql

    python 數(shù)據(jù)分析基礎 day12-python調(diào)用mysql
    發(fā)表于 10-23 13:34

    基于Python數(shù)據(jù)分析

    《利用Python進行數(shù)據(jù)分析》 113日期范圍、頻率和移位
    發(fā)表于 05-01 11:24

    成為Python數(shù)據(jù)分析師,需要掌握哪些技能

    數(shù)據(jù)驅動問題解決第四、數(shù)據(jù)分析師要求的三大能力統(tǒng)計學基礎和分析工具應用計算機編碼能力特定應用領域或行業(yè)的知識第五數(shù)據(jù)分析數(shù)據(jù)分析很重要的學科
    發(fā)表于 06-23 12:16

    成為Python數(shù)據(jù)分析師,需要掌握哪些技能

    數(shù)據(jù)驅動問題解決第四、數(shù)據(jù)分析師要求的三大能力統(tǒng)計學基礎和分析工具應用計算機編碼能力特定應用領域或行業(yè)的知識第五數(shù)據(jù)分析數(shù)據(jù)分析很重要的學科
    發(fā)表于 06-30 11:42

    pandas是什么?

    人工智能的不斷發(fā)展,機器學習這門技術也越來越重要,很多人都開啟了學習機器學習,本文就介紹了機器學習的基礎內(nèi)容。提示:以下是本篇文章正文內(nèi)容,下面案例可供參考一、
    發(fā)表于 01-12 07:53

    機器學習開發(fā)課程,使用Pandas探索數(shù)據(jù)分析

    Pandas是一個Python庫,提供了大量數(shù)據(jù)分析的方法。數(shù)據(jù)科學家經(jīng)常和表格形式的數(shù)據(jù)(比如.csv、.tsv、.xlsx)打交道。
    的頭像 發(fā)表于 03-14 18:07 ?4849次閱讀

    解讀12 Numpy 和 Pandas 高效函數(shù)技巧

    本文分享給大家 12 Numpy 和 Pandas 函數(shù),這些高效的函數(shù)會令數(shù)據(jù)分析更為容易、便捷。最后,讀者也可以在 GitHub 項目中找到本文所用代碼的 Jupyter No
    的頭像 發(fā)表于 06-29 17:05 ?1527次閱讀

    Python Pandas如何來管理結構化數(shù)據(jù)

    Python Pandas是一個為Python編程提供數(shù)據(jù)操作和分析功能的開源工具包。這個庫已經(jīng)成為數(shù)據(jù)
    的頭像 發(fā)表于 05-25 11:22 ?723次閱讀
    <b class='flag-5'>Python</b> <b class='flag-5'>Pandas</b>如何來管理結構化<b class='flag-5'>數(shù)據(jù)</b>

    python機器學習概述

    是一非常流行的編程語言,因為它具有非常強大的數(shù)據(jù)分析和科學計算庫。Python可以被用來完成一系列的任務,包括機器學習
    的頭像 發(fā)表于 08-17 16:11 ?1109次閱讀

    PandasPython中最好的數(shù)據(jù)分析工具

    Pandas絕對是Python中最好的數(shù)據(jù)分析工具,不接受反駁。 本文將展示如何美化 Pandas DataFrame 中的數(shù)字,并使用一些更高級的
    的頭像 發(fā)表于 10-31 10:47 ?559次閱讀
    <b class='flag-5'>Pandas</b>:<b class='flag-5'>Python</b>中最好的<b class='flag-5'>數(shù)據(jù)分析</b>工具
    永利博百家乐官网的玩法技巧和规则 | 大发888赌场网址| 百家乐官网扑克多少张| 百家乐的巧门| 百家乐官网有多少局| 百家乐赚钱项目| 棋牌室名字| 百家乐官网赢退输进有哪些| 威尼斯人娱乐代理注册| 澳门百家乐官网海洋阿强| 线上百家乐是如何作弊| 百家乐官网庄和闲的赌法| 百家乐皇室百家乐| 百家乐官网电脑赌博| 百家乐博彩吧| 易球百家乐官网娱乐城| 大发888娱乐城游戏lm0| 钱隆百家乐官网破解版| 大发888娱乐场下载ypu| 鸟巢百家乐官网的玩法技巧和规则| 大发888娱乐大发体育| 百家乐官网五湖四海赌场娱乐网规则 | 做生意开店铺风水大全| 凯旋门娱乐城开户| 百家乐投注方式| 阿拉善右旗| 立即博百家乐娱乐城| 百家乐官网现金网开户平台| 恒利百家乐的玩法技巧和规则| 百家乐官网明灯| 大发888 dafa888 大发官网| 赌百家乐官网2号破解| 齐河县| 百家乐的战术| 真人百家乐官网开户优惠| 大发888娱乐城ipad| 罗盘24山作用| 百家乐赌场代理荐| 百家乐官网北京| 优博国际娱乐| 百家乐如何买大小|