Pandas groupby apply agg 的區(qū)別 運(yùn)行自定義函數(shù)說(shuō)明
agg 方法將一個(gè)函數(shù)使用在一個(gè)數(shù)列上,然后返回一個(gè)標(biāo)量的值。也就是說(shuō)agg每次傳入的是一列數(shù)據(jù),對(duì)其聚合后返回標(biāo)量。
對(duì)一列使用三個(gè)函數(shù):
對(duì)不同列使用不同函數(shù)
apply 是一個(gè)更一般化的方法:將一個(gè)數(shù)據(jù)分拆-應(yīng)用-匯總。而apply會(huì)將當(dāng)前分組后的數(shù)據(jù)一起傳入,可以返回多維數(shù)據(jù)。
實(shí)例:
1、數(shù)據(jù)如下:
lawsuit2[['EID','LAWAMOUNT','LAWDATE']]
2、groupby后應(yīng)用apply傳入函數(shù)數(shù)據(jù)如下:
lawsuit2[['EID','LAWAMOUNT','LAWDATE']].groupby(['EID']).apply(lambda df:print(df))
3、如果使用agg,對(duì)于兩列可以處理,但對(duì)于上面的三列,打印數(shù)據(jù)如下:
lawsuit2[['EID','LAWAMOUNT','LAWDATE']].groupby(['EID']).agg(lambda df:print(df))
可以看到agg傳入的只有一列數(shù)據(jù),如果我們使用df加列下表強(qiáng)行取值也能取到,但是有時(shí)會(huì)出現(xiàn)各種keyError問(wèn)題。
4、完整代碼:
判斷最近一次日期的花費(fèi)是否是所有的花費(fèi)中最大花費(fèi)。
def handle(df): # print(df) # 找最大日期 maxdate = df['LAWDATE'].max() # 找最大費(fèi)用 left = df[ df['LAWDATE']==maxdate ]['LAWAMOUNT'].max() # 取ID EID = df['EID'].values[0] # print(EID) # 從已存在的表中根據(jù)EID找到最大費(fèi)用 right = LAW_AMOUNT_MAX.loc[EID,'LAW_AMOUNT_MAX'] # 判斷費(fèi)用是否相等 if left==right: return 1 else: return 0 LAW_AMOUNT_MAX_IS_LAST = lawsuit2[['EID','LAWAMOUNT','LAWDATE']].groupby(['EID']).apply(handle)
其他注意點(diǎn):
在groupby后使用apply,如果直接返回,會(huì)出現(xiàn)有多余的groupby索引問(wèn)題,可以使用group_keys解決:
orgin = reviews_df.sort_values(["reviewerID","unixReviewTime"]).groupby("reviewerID",group_keys=False) train = orgin.apply(lambda df: df[:-2]) train.head()
補(bǔ)充:pandas分組聚合運(yùn)算groupby之a(chǎn)gg,apply,transform
groupby函數(shù)是pandas中用以分組的函數(shù),可以通過(guò)指定列來(lái)進(jìn)行分組,并返回一個(gè)GroupBy對(duì)象。對(duì)于GroupBy對(duì)象的聚合運(yùn)算,其有經(jīng)過(guò)優(yōu)化的較為常用的sum,mean等函數(shù),但是如果我們需要用自定義的函數(shù)進(jìn)行聚合運(yùn)算,那么就需要通過(guò)agg,apply,transform來(lái)實(shí)現(xiàn)。
agg,apply和transform三者之間的區(qū)別在于:1、agg和transform之間的區(qū)別為:前者經(jīng)過(guò)聚合后,只會(huì)在該組單列中返回一個(gè)標(biāo)量值,而transform則會(huì)將該標(biāo)量值在該組單列內(nèi)進(jìn)行廣播,保持原DataFrame的索引不變;2、agg和transform中的函數(shù)參數(shù)是以分組后的單列(Series)為操作對(duì)象的,即傳入agg和transform的函數(shù)的參數(shù)是列,而apply中的函數(shù)參數(shù)是分組后整個(gè)的DataFrame。下面分別對(duì)這兩點(diǎn)進(jìn)行說(shuō)明。
一、agg和transform
如下代碼所示,構(gòu)造一個(gè)df,agg和transform中l(wèi)ambda函數(shù)的input都為單列,但是agg返回的索引是分組的key的唯一值,而transform返回的索引和原df一樣,但是相比于agg返回的結(jié)果,發(fā)現(xiàn)transform只是在d行處的值進(jìn)行了重復(fù)的廣播,這個(gè)目的就是維持原df的索引不變,且被拿來(lái)分組的列會(huì)被剔除。
df Out[1]: index a b c 0 d 0 1 2 1 d 3 4 5 2 e 6 7 8 df.groupby(by='index').agg(lambda x:x.shape) Out[2]: a b c index d (2,) (2,) (2,) e (1,) (1,) (1,) df.groupby(by='index').transform(lambda x:x.shape) Out[3]: a b c 0 (2,) (2,) (2,) 1 (2,) (2,) (2,) 2 (1,) (1,) (1,)
二、agg和apply
下面的是apply的結(jié)果,相比于上面agg的結(jié)果,可以發(fā)現(xiàn),實(shí)際上lambda函數(shù)的input不再是一個(gè)Series,而是分組后的整個(gè)DataFrame。
dd.groupby(by='index').apply(lambda x:x.shape) Out[4]: index d (2, 4) e (1, 4)
三、其他注意點(diǎn)
對(duì)于agg函數(shù),其不僅可以傳入一個(gè)函數(shù)對(duì)每列執(zhí)行相同的操作,還可以傳入一個(gè)字典{'col_name':func},來(lái)對(duì)不同的列做不同的操作,也可以將func替換為由多個(gè)不同的函數(shù)組成的list,實(shí)現(xiàn)對(duì)同一列做多個(gè)不同的操作,這是agg函數(shù)最為靈活的地方。
這三個(gè)函數(shù),參數(shù)形式都為(func, *args,**kwargs),所以可以通過(guò)位置參數(shù)和關(guān)鍵字參數(shù)給func傳遞額外的參數(shù)。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
- Pandas實(shí)現(xiàn)groupby分組統(tǒng)計(jì)方法實(shí)例
- pandas中g(shù)roupby操作實(shí)現(xiàn)
- pandas中df.groupby()方法深入講解
- pandas?groupby?用法實(shí)例詳解
- Pandas數(shù)據(jù)分析之groupby函數(shù)用法實(shí)例詳解
- pandas中pd.groupby()的用法詳解
- 詳解Pandas中GroupBy對(duì)象的使用
- Pandas實(shí)現(xiàn)groupby分組統(tǒng)計(jì)的實(shí)踐
- Pandas中GroupBy具體用法詳解
- Pandas高級(jí)教程之Pandas中的GroupBy操作
- pandas groupby分組對(duì)象的組內(nèi)排序解決方案
- pandas groupby()的使用小結(jié)
相關(guān)文章
在Python的Django框架中實(shí)現(xiàn)Hacker News的一些功能
這篇文章主要介紹了在Python的Django框架中實(shí)現(xiàn)Hacker News的一些功能,包括投票“頂”評(píng)論等功能,需要的朋友可以參考下2015-04-04Python實(shí)現(xiàn)設(shè)計(jì)模式之單例模式詳解
這篇文章主要介紹了Python實(shí)現(xiàn)設(shè)計(jì)模式之單例模式詳解,設(shè)計(jì)模式是指軟件設(shè)計(jì)問(wèn)題的推薦方案,設(shè)計(jì)模式一般是描述如何組織代碼和使用最佳實(shí)踐來(lái)解決常見(jiàn)的設(shè)計(jì)問(wèn)題,需謹(jǐn)記一點(diǎn):設(shè)計(jì)模式是高層次的方案,并不關(guān)注具體的實(shí)現(xiàn)細(xì)節(jié),比如算法和數(shù)據(jù)結(jié)構(gòu),需要的朋友可以參考下2023-09-09python基于socket模擬實(shí)現(xiàn)ssh遠(yuǎn)程執(zhí)行命令
這篇文章主要介紹了python基于socket模擬實(shí)現(xiàn)ssh遠(yuǎn)程執(zhí)行命令,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-12-12Python NumPy中的隨機(jī)數(shù)及ufuncs函數(shù)使用示例詳解
這篇文章主要介紹了Python NumPy中的隨機(jī)數(shù)及ufuncs函數(shù)使用,ufunc函數(shù)是NumPy中的一種通用函數(shù),它可以對(duì)數(shù)組中的每個(gè)元素進(jìn)行操作,而不需要使用循環(huán)語(yǔ)句,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2023-05-05Python之random.sample()和numpy.random.choice()的優(yōu)缺點(diǎn)說(shuō)明
這篇文章主要介紹了Python之random.sample()和numpy.random.choice()的優(yōu)缺點(diǎn)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Keras 在fit_generator訓(xùn)練方式中加入圖像random_crop操作
這篇文章主要介紹了Keras 在fit_generator訓(xùn)練方式中加入圖像random_crop操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-07-07Python學(xué)習(xí)之基礎(chǔ)語(yǔ)法介紹
大家好,本篇文章主要講的是Python學(xué)習(xí)之基礎(chǔ)語(yǔ)法介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12