日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Pandas中的 transform() 结合 groupby() 用法示例

發布時間:2023/12/4 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Pandas中的 transform() 结合 groupby() 用法示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先,假設我們有如下餐廳數據集:

import pandas as pddf = 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] })


如果我們想知道:每個餐廳在城市中所占的銷售額百分比是多少?預期得到的輸出是:

相比于原來的數據集,多了兩列,分別是某個城市所有餐廳的銷售總額,以及每個餐廳在城市中所占的銷售額百分比。解決方案有兩個:

方案一(較麻煩):

1、使用 groupby('city') 基于城市進行分組,對于這些組中的每一個組,選中其銷售額列 ['sales'],然后使用函數 apply(sum) 或者sum() 對城市的銷售額進行求和。

之后,新列被重命名為 city_total_sales 并且索引被重置(注意不能漏了 reset_index() ,因為 groupby('city') 生成的索引是城市,而我們希望城市作為普通列)。

city_sales = df.groupby('city'['sales'].sum().rename('city_total_sales').reset_index()

得到的 city_sales 如下:

2、用 merge() 函數把 city_sales 合并回去,得到的 df_new 如下:

df_new = pd.merge(df, city_sales, how='left')


3、最后,求百分比并保留兩位小數,結果如下:

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() 函數在執行轉換后保留與原始數據集相同數量的項目。因此,使用 groupby() 然后使用 transform(sum) 會返回相同的輸出,結果如下圖:

df['city_total_sales'] = df.groupby('city')['sales'].transform('sum')

代碼翻譯過來就是:數據集基于城市進行分組,然后選定銷售額列,對每組的銷售額進行求和,返回一個和原列長度一樣的新列

2

與方案一相同。

df['pct'] = df['sales'] / df['city_total_sales'] df['pct'] = df['pct'].apply(lambda x: format(x, '.2%'))

總結:可以看出,在對 DataFrame 進行分組 groupby() 之后,如果是使用 apply() 或者直接使用某個統計函數,得到的新列的長度與分組得到的組數是一樣的;而如果使用 transform() ,得到的新列與 DataFrame 中列的長度是一樣的

總結

以上是生活随笔為你收集整理的Pandas中的 transform() 结合 groupby() 用法示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。