Pandas中的 transform()結(jié)合 groupby()用法示例詳解
首先,假設(shè)我們有如下餐廳數(shù)據(jù)集:
import pandas as pd df = pd.DataFrame({ 'restaurant_id': [101,102,103,104,105,106,107], 'address': ['A','B','C','D', 'E', 'F', 'G'], 'city': ['London','London','London','Oxford','Oxford', 'Durham', 'Durham'], 'sales': [10,500,48,12,21,22,14] })
如果我們想知道:每個(gè)餐廳在城市中所占的銷售額百分比是多少?預(yù)期得到的輸出是:
相比于原來的數(shù)據(jù)集,多了兩列,分別是某個(gè)城市所有餐廳的銷售總額,以及每個(gè)餐廳在城市中所占的銷售額百分比。解決方案有兩個(gè):
方案一(較麻煩):
1、使用 groupby('city')
基于城市進(jìn)行分組,對于這些組中的每一個(gè)組,選中其銷售額列 ['sales']
,然后使用函數(shù) apply(sum)
或者sum()
對城市的銷售額進(jìn)行求和。
之后,新列被重命名為 city_total_sales
并且索引被重置(注意不能漏了 reset_index()
,因?yàn)?groupby('city')
生成的索引是城市,而我們希望城市作為普通列)。
city_sales = df.groupby('city')['sales'] .sum().rename('city_total_sales').reset_index()
得到的 city_sales
如下:
2、用 merge()
函數(shù)把 city_sales
合并回去,得到的 df_new
如下:
df_new = pd.merge(df, city_sales, how='left')
3、最后,求百分比并保留兩位小數(shù),結(jié)果如下:
df_new['pct'] = df_new['sales'] / df_new['city_total_sales'] df_new['pct'] = df_new['pct'].apply(lambda x: format(x, '.2%'))
方案二(便捷):
1、
transform()
函數(shù)在執(zhí)行轉(zhuǎn)換后保留與原始數(shù)據(jù)集相同數(shù)量的項(xiàng)目。因此,使用 groupby()
然后使用 transform(sum)
會(huì)返回相同的輸出,結(jié)果如下圖:
df['city_total_sales'] = df.groupby('city')['sales'] .transform('sum')
代碼翻譯過來就是:數(shù)據(jù)集基于城市進(jìn)行分組,然后選定銷售額列,對每組的銷售額進(jìn)行求和,返回一個(gè)和原列長度一樣的新列。
2、
與方案一相同。
df['pct'] = df['sales'] / df['city_total_sales'] df['pct'] = df['pct'].apply(lambda x: format(x, '.2%'))
總結(jié):可以看出,在對 DataFrame 進(jìn)行分組 groupby()
之后,如果是使用 apply()
或者直接使用某個(gè)統(tǒng)計(jì)函數(shù),得到的新列的長度與分組得到的組數(shù)是一樣的;而如果使用 transform()
,得到的新列與 DataFrame 中列的長度是一樣的。
到此這篇關(guān)于Pandas中的 transform()結(jié)合 groupby()用法示例詳解的文章就介紹到這了,更多相關(guān)Pandas groupby() 用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)windows倒計(jì)時(shí)鎖屏功能
這篇文章主要介紹了python實(shí)現(xiàn)windows倒計(jì)時(shí)鎖屏功能,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07Python和RabbitMQ進(jìn)行消息傳遞和處理方式
這篇文章主要介紹了Python和RabbitMQ進(jìn)行消息傳遞和處理方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Python基于React-Dropzone實(shí)現(xiàn)上傳組件的示例代碼
本文主要介紹了在React-Flask框架上開發(fā)上傳組件的技巧。文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08Python基礎(chǔ)之循環(huán)語句用法示例【for、while循環(huán)】
這篇文章主要介紹了Python基礎(chǔ)之循環(huán)語句用法,結(jié)合實(shí)例形式分析了Python使用for、while循環(huán)及range、break和continue語句相關(guān)使用技巧,需要的朋友可以參考下2019-03-03Flask框架利用Echarts實(shí)現(xiàn)繪制圖形
echarts是百度推出的一款開源的基于JavaScript的可視化圖表庫,該開發(fā)庫目前發(fā)展非常不錯(cuò),且支持各類圖形的繪制可定制程度高。如下演示案例中,將分別展示運(yùn)用該繪圖庫如何前后端交互繪制(餅狀圖,柱狀圖,折線圖)這三種最基本的圖形,需要的可以參考一下2022-10-10創(chuàng)建SparkSession和sparkSQL的詳細(xì)過程
SparkSession 是 Spark SQL 的入口,Builder 是 SparkSession 的構(gòu)造器。 通過 Builder, 可以添加各種配置,并通過 stop 函數(shù)來停止 SparkSession,本文給大家分享創(chuàng)建SparkSession和sparkSQL的詳細(xì)過程,一起看看吧2021-08-08Python存儲(chǔ)List數(shù)據(jù)到文件(text/csv/excel)幾種常見方法
在數(shù)據(jù)分析中經(jīng)常需要從csv格式的文件中存取數(shù)據(jù)以及將數(shù)據(jù)寫書到csv文件中,下面這篇文章主要給大家介紹了關(guān)于Python存儲(chǔ)List數(shù)據(jù)到文件(text/csv/excel)的幾種常見方法,需要的朋友可以參考下2024-02-02