相關(guān)學(xué)習(xí)推薦:python視頻教程
今天是pandas數(shù)據(jù)處理專題的第5篇文章,我們來聊聊pandas的一些高級運(yùn)算。
在上一篇文章當(dāng)中,我們介紹了panads的一些計(jì)算方法,比如兩個dataframe的四則運(yùn)算,以及dataframe填充Null的方法。今天這篇文章我們來聊聊dataframe中的廣播機(jī)制,以及apply函數(shù)的使用方法。
dataframe廣播
廣播機(jī)制我們其實(shí)并不陌生, 我們在之前介紹numpy的專題文章當(dāng)中曾經(jīng)介紹過廣播。當(dāng)我們對兩個尺寸不一致的數(shù)組進(jìn)行運(yùn)算的時候,系統(tǒng)會自動將其中維度較小的那個填充成和另外一個一樣再進(jìn)行計(jì)算。
比如我們將一個二維數(shù)組減去一個一維數(shù)組,numpy會先將一位數(shù)組拓展到二維之后再進(jìn)行減法運(yùn)算。看起來就像是二維數(shù)組的每一行分別減去了這一個一維數(shù)組一樣。可以理解成我們將減去這一個一維數(shù)組的操作廣播到了二維數(shù)組的每一行或者是每一列當(dāng)中。

在上面這個例子當(dāng)中我們創(chuàng)建了一個numpy的數(shù)組,然后減去了它的第一行。我們對比下最后的結(jié)果會發(fā)現(xiàn),arr數(shù)組當(dāng)中的每一行都減去了它的第一行。
同樣的操作在dataframe也一樣可以進(jìn)行。

我們當(dāng)然也可以對某一列進(jìn)行廣播,但是dataframe四則運(yùn)算的廣播機(jī)制默認(rèn)對行生效,如果要對列使用的話,我們需要使用算術(shù)運(yùn)算方法,并且指定希望匹配的軸。

函數(shù)與映射
pandas的另外一個優(yōu)點(diǎn)是兼容了numpy當(dāng)中的一些運(yùn)算方法和函數(shù),使得我們也可以將一些numpy當(dāng)中的函數(shù)運(yùn)用在DataFrame上,這樣就大大拓展了使用方法以及運(yùn)算方法。
比如我們要將DataFrame當(dāng)中所有的元素變成它的平方,我們利用numpy的square方法可以很容易做到:

我們可以將DataFrame作為numpy函數(shù)的參數(shù)傳入,但如果我們想要自己定義一個方法并且應(yīng)用在DataFrame上怎么辦?
我們可以利用apply方法很容易地實(shí)現(xiàn)這一點(diǎn),apply方法有些像是Python原生的map方法,可以對DataFrame當(dāng)中的每一個元素做一個映射計(jì)算。我們只需要在apply方法當(dāng)中傳入我們想要應(yīng)用在DataFrame上的方法即可,也就是說它接受的參數(shù)是一個函數(shù),這是一個很典型的函數(shù)式編程的應(yīng)用。
比如我們想要對DataFrame進(jìn)行平方操作,我們也可以將np.square函數(shù)當(dāng)做參數(shù)傳入。

apply方法除了可以用在一整個DataFrame上之外,我們也可以讓它應(yīng)用在某一行或者是某一列或者是某一個部分上,應(yīng)用的方法都是一樣的。比如我們可以這樣對DataFrame當(dāng)中的某一行以及某一列應(yīng)用平方這個方法。

另外,apply中函數(shù)的作用域并不只局限在元素,我們也可以寫出作用在一行或者是一列上的函數(shù)。比如我們想要計(jì)算出DataFrame當(dāng)中每一列的最大值,我們可以這樣寫:

這個匿名函數(shù)當(dāng)中的x其實(shí)是一個Series,那這里的max就是Series自帶的max方法。也就是說apply的作用范圍是Series,雖然最終的效果是每一個元素都被改變了,但是apply的作用域并不是元素而是Series。我們通過apply操作行或者列,行和列將改變應(yīng)用到每一個元素。
同樣我們也可以將apply的應(yīng)用對象限定為行,同樣我們需要通過傳入axis來限定,我們可以傳入axis='columns',也可以指定axis=1,這兩者的效果是一樣的。

另外,apply返回的結(jié)果并不一定只能是標(biāo)量,也可以是多個值組成的list或者是Series,其實(shí)兩者也是一樣的,因?yàn)榧词狗祷豅ist也會被轉(zhuǎn)化成Series。

最后我們來介紹一下applymap,它是元素級的map,我們可以用它來操作DataFrame中的每一個元素。比如我們可以用它來轉(zhuǎn)換DataFrame當(dāng)中數(shù)據(jù)的格式。

之所以我們叫它applymap而不是map,是因?yàn)樵赟eries的方法當(dāng)中,已經(jīng)有了map,所以為了區(qū)分創(chuàng)建了applymap。
這里要注意,如果將上面代碼中的applymap改成apply是會報(bào)錯的。報(bào)錯的原因也很簡單,因?yàn)閍pply方法的作用域不是元素而是Series,Series并不支持這樣的操作。
總結(jié)
今天的文章我們主要介紹了pandas當(dāng)中apply與applymap的使用方法, 這兩個方法在我們?nèi)粘2僮鱀ataFrame的數(shù)據(jù)非常常用,可以說是手術(shù)刀級的api。熟練掌握對于我們搞定數(shù)據(jù)處理非常有幫助,如果大家理解Python中原生的map方法的應(yīng)用,相信一定也可以很順利地理解今天的文章。
想了解