本文始發於我的公衆號:TechFlow,原創不易,求個關注web
今天是pandas數據處理專題的第5篇文章,咱們來聊聊pandas的一些高級運算。編程
在上一篇文章當中,咱們介紹了panads的一些計算方法,好比兩個dataframe的四則運算,以及dataframe填充Null的方法。今天這篇文章咱們來聊聊dataframe中的廣播機制,以及apply函數的使用方法。api
廣播機制咱們其實並不陌生, 咱們在以前介紹numpy的專題文章當中曾經介紹過廣播。當咱們對兩個尺寸不一致的數組進行運算的時候,系統會自動將其中維度較小的那個填充成和另一個同樣再進行計算。數組
好比咱們將一個二維數組減去一個一維數組,numpy會先將一位數組拓展到二維以後再進行減法運算。看起來就像是二維數組的每一行分別減去了這一個一維數組同樣。能夠理解成咱們將減去這一個一維數組的操做廣播到了二維數組的每一行或者是每一列當中。app
在上面這個例子當中咱們建立了一個numpy的數組,而後減去了它的第一行。咱們對比下最後的結果會發現,arr數組當中的每一行都減去了它的第一行。編輯器
一樣的操做在dataframe也同樣能夠進行。函數式編程
咱們固然也能夠對某一列進行廣播,可是dataframe四則運算的廣播機制默認對行生效,若是要對列使用的話,咱們須要使用算術運算方法,而且指定但願匹配的軸。函數
pandas的另一個優勢是兼容了numpy當中的一些運算方法和函數,使得咱們也能夠將一些numpy當中的函數運用在DataFrame上,這樣就大大拓展了使用方法以及運算方法。flex
好比咱們要將DataFrame當中全部的元素變成它的平方,咱們利用numpy的square方法能夠很容易作到:spa
咱們能夠將DataFrame做爲numpy函數的參數傳入,但若是咱們想要本身定義一個方法而且應用在DataFrame上怎麼辦?
咱們能夠利用apply方法很容易地實現這一點,apply方法有些像是Python原生的map方法,能夠對DataFrame當中的每個元素作一個映射計算。咱們只須要在apply方法當中傳入咱們想要應用在DataFrame上的方法便可,也就是說它接受的參數是一個函數,這是一個很典型的函數式編程的應用。
好比咱們想要對DataFrame進行平方操做,咱們也能夠將np.square函數當作參數傳入。
apply方法除了能夠用在一整個DataFrame上以外,咱們也可讓它應用在某一行或者是某一列或者是某一個部分上,應用的方法都是同樣的。好比咱們能夠這樣對DataFrame當中的某一行以及某一列應用平方這個方法。
另外,apply中函數的做用域並不僅侷限在元素,咱們也能夠寫出做用在一行或者是一列上的函數。好比咱們想要計算出DataFrame當中每一列的最大值,咱們能夠這樣寫:
這個匿名函數當中的x實際上是一個Series,那這裏的max就是Series自帶的max方法。也就是說apply的做用範圍是Series,雖然最終的效果是每個元素都被改變了,可是apply的做用域並非元素而是Series。咱們經過apply操做行或者列,行和列將改變應用到每個元素。
一樣咱們也能夠將apply的應用對象限定爲行,一樣咱們須要經過傳入axis來限定,咱們能夠傳入axis='columns',也能夠指定axis=1,這二者的效果是同樣的。
另外,apply返回的結果並不必定只能是標量,也能夠是多個值組成的list或者是Series,其實二者也是同樣的,由於即便返回List也會被轉化成Series。
最後咱們來介紹一下applymap,它是元素級的map,咱們能夠用它來操做DataFrame中的每個元素。好比咱們能夠用它來轉換DataFrame當中數據的格式。
之因此咱們叫它applymap而不是map,是由於在Series的方法當中,已經有了map,因此爲了區分建立了applymap。
這裏要注意,若是將上面代碼中的applymap改爲apply是會報錯的。報錯的緣由也很簡單,由於apply方法的做用域不是元素而是Series,Series並不支持這樣的操做。
今天的文章咱們主要介紹了pandas當中apply與applymap的使用方法, 這兩個方法在咱們平常操做DataFrame的數據很是經常使用,能夠說是手術刀級的api。熟練掌握對於咱們搞定數據處理很是有幫助,若是你們理解Python中原生的map方法的應用,相信必定也能夠很順利地理解今天的文章。
今天的文章到這裏就結束了,若是喜歡本文的話,請來一波素質三連,給我一點支持吧(關注、轉發、點贊)。
- END -