Pandas函數(shù)應(yīng)用

不管是為Pandas對(duì)象應(yīng)用自定義函數(shù),還是應(yīng)用第三方函數(shù),都離不開以下幾種方法。用哪種方法取決于操作的對(duì)象是DataFrame,還是Series;是行、列,還是元素。

1.表現(xiàn)級(jí)函數(shù)應(yīng)用:pipe()

2.行列級(jí)函數(shù)應(yīng)用:apply()

3.聚合API:agg()與transform()

4.元素級(jí)函數(shù)應(yīng)用:applymap()

表現(xiàn)級(jí)函數(shù)應(yīng)用

雖然可以把DataFrame與Series傳遞給函數(shù),不過鏈?zhǔn)秸{(diào)用函數(shù)時(shí),最好使用pipe()方法。對(duì)比以下兩種方式:


下列代碼與上述代碼是等效的:


Pandas建議使用第二種方式,即鏈?zhǔn)椒椒?。在鏈?zhǔn)椒椒ㄖ姓{(diào)用自定義函數(shù)或第三方支持庫函數(shù)時(shí),用pipe更容易,與用Pandas自身方法一樣。

上述示例中,f、g與h這幾個(gè)函數(shù)都把DataFrame當(dāng)作首位參數(shù)。要是想把數(shù)據(jù)作為第二個(gè)參數(shù),我們可以怎么做呢?本例中,pipe為元組(callable,data_keyword)形式。.pipe把DataFrame作為元組里指定的參數(shù)。

下面示例用statmodels擬合回歸,該API先接收一個(gè)公示,DataFrame是第二個(gè)參數(shù),data。要傳遞函數(shù),則要用pipe接收關(guān)鍵詞對(duì)(sm.ols,’data’)。


unix的pipe與后來出現(xiàn)的dplyr及magrittr帶動(dòng)了pipe方法,在此,引入了R語言里用于讀取pipe的操作符(%>%)。pipe的實(shí)現(xiàn)思路非常清晰,仿佛跟Python源生的一樣。

行列級(jí)函數(shù)應(yīng)用

apply()方法沿著DataFrame的軸應(yīng)用函數(shù),比如,描述性統(tǒng)計(jì)方法,該方法支持axis參數(shù)。


apply()方法還支持通過函數(shù)名字符串調(diào)用函數(shù)。


默認(rèn)情況下,apply()調(diào)用的函數(shù)返回的類型會(huì)影響DataFrame輸出結(jié)構(gòu)的類型。

函數(shù)返回的是Series時(shí),最終輸出結(jié)果是DataFrame。輸出的列與函數(shù)返回的Series索引相匹配。

函數(shù)返回其它任意類型時(shí),輸出結(jié)果是Series。

result_type會(huì)覆蓋默認(rèn)行為,該參數(shù)有三個(gè)選項(xiàng):reduce、broadcast、expand。

這些選項(xiàng)決定了列表型返回值是否擴(kuò)展為DataFrame。

我們用好了apply()的話,可以了解數(shù)據(jù)集的很多信息。比如可以提取每列的最大值對(duì)應(yīng)的日期:


還可以向apply()方法傳遞額外的參數(shù)與關(guān)鍵字參數(shù)。比如下面示例中要應(yīng)用的這個(gè)函數(shù):


可以用以下方式應(yīng)用該函數(shù):


為每行或每例執(zhí)行Series方法的功能也非常的實(shí)用:


apply()有一個(gè)參數(shù)raw,默認(rèn)值為False,再應(yīng)用函數(shù)前,使用該參數(shù)可以將每行或列轉(zhuǎn)換為Series。該參數(shù)為True時(shí),傳遞的函數(shù)接收ndarray對(duì)象,若不需要索引功能,這樣操作能夠顯著的提高性能。

聚合API

聚合API可以快速、簡(jiǎn)潔地執(zhí)行多個(gè)聚合操作。Pandas對(duì)象支持多個(gè)類似地API,如groupby

API、window functions API、resample

API。聚合函數(shù)為DataFrame.aggregate(),也可以叫做Dataframe.agg()。

在這里我們用與上例類似的DataFrame:


應(yīng)用單個(gè)函數(shù)時(shí),該操作與apply()等效,這里也可以用字符串表示聚合函數(shù)名。下面的聚合函數(shù)輸出的結(jié)果為Series:


Series單個(gè)聚合操作返回標(biāo)量值:


多聚合函數(shù)

還可以用列表形式傳遞多個(gè)聚合函數(shù)。每個(gè)函數(shù)在輸出結(jié)果DataFrame里以行的形式顯示,行名是每個(gè)聚合函數(shù)的函數(shù)名。


多個(gè)函數(shù)輸出多行:


Series聚合多函數(shù)返回結(jié)果還是Series,索引為函數(shù)名:


傳遞lambda函數(shù)時(shí),輸出名為<lambda>的行:


應(yīng)用自定義函數(shù)時(shí),該函數(shù)名為輸出結(jié)果的行名:


用字典實(shí)現(xiàn)聚合

指定為哪些列應(yīng)用哪些聚合函數(shù)時(shí),需要把包含列名與標(biāo)量(或標(biāo)量列表)的字典傳遞給DataFrame.agg。

但我們要注意,這里輸出結(jié)果的順序不是固定的,要想讓輸出順序與輸入順序一致,我們可以使用OrderedDict。


輸出的參數(shù)是列表時(shí),輸出的結(jié)果為DataFrame,并以矩陣形式顯示所有聚合函數(shù)的計(jì)算結(jié)果,且輸出結(jié)果有所有唯一函數(shù)組成。未執(zhí)行聚合操作的列輸出結(jié)果為NaN值:


多種數(shù)據(jù)類型(Dtype)

與groupby的.agg操作類似,DataFrame含不能執(zhí)行聚合的數(shù)據(jù)類型時(shí),.agg只計(jì)算可聚合的列:



自定義Describe

.agg()可以創(chuàng)建類似于內(nèi)置describe函數(shù)的自定義describe函數(shù)。


Transfrom API

transform方法的返回結(jié)果與原始數(shù)據(jù)的索引相同,大小相同。與.agg API類似,該API支持同時(shí)處理多種操作,不用一個(gè)一個(gè)操作。

首先,創(chuàng)建一個(gè)DataFrame:


這里轉(zhuǎn)換的是整個(gè)DataFrame。.transform()支持NumPy函數(shù)、字符串函數(shù)及自定義函數(shù)。


這里的transform()接收單個(gè)函數(shù);與ufunc等效。


.transform向Series傳遞單個(gè)函數(shù)時(shí),返回的結(jié)果也是單個(gè)Series。


多函數(shù)Transfrom

transform()調(diào)用多個(gè)函數(shù)時(shí),生成多層索引DataFrame。第一層是原始數(shù)據(jù)集的列名;第二層是transform()調(diào)用的函數(shù)名。


為Series應(yīng)用多個(gè)函數(shù)時(shí),輸出結(jié)果是DataFrame,列名是transform()調(diào)用的函數(shù)名。


用字典執(zhí)行transfrom操作

函數(shù)字典可以為每列執(zhí)行指定transform()操作。


transform()的參數(shù)是列表字典時(shí),生成的是以transform()調(diào)用的函數(shù)名為多層索引的DataFrame。


元素級(jí)函數(shù)應(yīng)用

并非所有函數(shù)都能矢量化,即接受NumPy數(shù)組,返回另一個(gè)數(shù)組或值,DataFrame的applymap()及Series的map(),支持任何接收單個(gè)值并返回單個(gè)值的Python函數(shù)。


Series.map()還有個(gè)功能,可以“連接”或“映射”第二個(gè)Series定義的值。這與merging/joining功能聯(lián)系非常緊密:


以上就是Pandas函數(shù)應(yīng)用的所有知識(shí)了,希望對(duì)你有所幫助。

如果你想學(xué)習(xí)Python,但是找不到學(xué)習(xí)路徑和資源,歡迎來指尖編程。

高效在線交互式學(xué)Python,更快更好!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容