不管是為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,更快更好!