pandas的apply函數是自動根據function遍歷每一個數據,然后返回一個數據結構為Series的結果
DataFrame.apply(func, axis=0, broadcast=False, raw=False, reduce=None, args=(), **kwds)
參數解釋:
1.func:就是函數,不管是自定義的函數,還是匿名函數lambda
2.axis:0是類,1是行,默認axis=0
例子:
import numpy as np import pandas as pd a=np.arange(1,13).reshape(3,4) df=pd.DataFrame(a,columns=list('abcd')) df.apply(lambda x:x.sum()) df.apply(lambda x:x.sum(),axis=1) #應用於Series數據 df['a'].apply(lambda x:x*x)
如果是fun的參數是一個字表,也就是groupby之后的字表,這時我們這樣使用
zg_tmp.groupby('label').apply(lambda x:pc.cols_report(x)) #或者是 zg_tmp.groupby('label').apply(pc.cols_report)
apply的使用總共基本用於三處,1是你要對每條記錄進行遍歷去函數計算出一個值,2是你要對某一列進行操作,3是你groupby后要對每個group后的字表df
df.apply(lambda x:func(x,args**),axis=1) df.apply(lambda x:func(x,args**),axis=0) df.groupby([column1]).apply(lambda x:func(x,args**))
df.groupby(“count”).get_group(1)獲得某一組的df
df.groupby(“count”).groups獲得所有組的兩端索引的列表,以索引表示
df.groupby(“count”).indices獲得所有組的兩端索引的列表,以列表表示
如果函數中有多個參數,我們可以使用args=(),括號里面就是除第一個參數外,其余的參數
=======================================2021.01.25補充======================================
那么apply應用在Pandas中,其核心功能其實可以概括為一句話:
apply:我本身不處理數據,我們只是數據的搬運工。
apply自身是不帶有任何數據處理功能的,但可以用作是對其他數據處理方法的調度器,至於調度什么又為誰而調度呢?這是理解apply的兩個核心環節:
-
調度什么?調度的是apply函數接收的參數,即apply接收一個數據處理函數為主要參數,並將其應用到相應的數據上。所以調度什么取決於接收了什么樣的數據處理函數;
-
為誰調度?也就是apply接收的數據處理函數,其作用對象是誰?或者說數據處理的粒度是什么?答案是數據處理的粒度包括了點線面三個層面:即可以是單個元素(標量,scalar),也可以是一行或一列(series),還可以是一個dataframe。
理解apply核心在於明確兩個環節:調度函數和作用對象。調度函數就是apply接收的參數,既可以是Python內置的函數,也支持自定義函數,只要符合指定的作用對象(即是標量還是series亦或一個dataframe)即可。而作用對象則取決於調用apply的對象類型,具體來說:
-
一個Series對象調用apply時,數據處理函數作用於該Series的每個元素上,即作用對象是一個標量,實現從一個Series轉換到另一個Series;
-
一個DataFrame對象調用apply時,數據處理函數作用於該DataFrame的每一行或者每一列上,即作用對象是一個Series,實現從一個DataFrame轉換到一個Series上;
-
一個DataFrame對象經過groupby分組后調用apply時,數據處理函數作用於groupby后的每個子dataframe上,即作用對象還是一個DataFrame(行是每個分組對應的行;列字段少了groupby的相應列),實現從一個DataFrame轉換到一個Series上