groupby是Pandas在數據分析中最常用的函數之一。它用于根據給定列中的不同值對數據點(即行)進行分組,分組后的數據可以計算生成組的聚合值。 如果我們有一個包含汽車品牌和價格信息的數據集,那么可以使用groupby功能來計算每個品牌的平均價格。 在本文中,我們將使用25個示例來詳細介紹groupby函數的用法。這25個示例中還包含了一些不太常用但在各種任務中都能派上用場的操作。 這里使用的數據集是隨機生成的,我們把它當作一個銷售的數據集。
importpandasaspd sales=pd.read_csv("sales_data.csv") sales.head()
![feb2260c-5032-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ--ARDn5AACQ4WUMiP4123.png)
sales.groupby("store")["stock_qty"].mean() #輸出 store Daisy1811.861702 Rose1677.680000 Violet14622.406061 Name:stock_qty,dtype:float64
2、多列聚合
在一個操作中進行多個聚合。以下是我們如何計算每個商店的平均庫存數量和價格。
sales.groupby("store")[["stock_qty","price"]].mean()sales.groupby("store")[["stock_qty","price"]].mean()
![fecf769e-5032-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ--AU1ZOAABpIlWjuRc595.png)
sales.groupby("store")["stock_qty"].agg(["mean","max"])
![feea618e-5032-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ--AOx9fAAJ1ahGDeHA493.png)
sales.groupby("store").agg( avg_stock_qty=("stock_qty","mean"), max_stock_qty=("stock_qty","max") )
![ff8cb8bc-5032-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ--AI79bAABotUJ8z6E101.png)
sales.groupby("store")[["stock_qty","price"]].agg(["mean","max"])
6、對不同列的聚合進行命名
sales.groupby("store").agg( avg_stock_qty=("stock_qty","mean"), avg_price=("price","mean") )
![ffb730ba-5032-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_CAa01hAAK00ELfR78849.png)
sales.groupby("store",as_index=False).agg( avg_stock_qty=("stock_qty","mean"), avg_price=("price","mean") )
![ffdbaeae-5032-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_CAMwlDAAByQDmiHG4691.png)
sales.groupby(["store","product_group"],as_index=False).agg( avg_sales=("last_week_sales","mean") ).head()
![fff29006-5032-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_CACkAsAAFQGv9BEk4661.png)
sales.groupby(["store","product_group"],as_index=False).agg(avg_sales=("last_week_sales","mean") ).sort_values(by="avg_sales",ascending=False).head()
![0026e748-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_CADeaEAACHL4MXW7k072.png)
sales.groupby("store")["last_week_sales"].nlargest(2) store Daisy4131883 231947 Rose948883 263623 Violet9913222 3392690 Name:last_week_sales,dtype:int64
11、最小的Top N
與最大值相似,也可以求最小值
sales.groupby("store")["last_week_sales"].nsmallest(2)
12、第n個值
除上面2個以外,還可以找到一組中的第n個值。
sales_sorted=sales.sort_values(by=["store","last_month_sales"],ascending=False,ignore_index=True)
找到每個店鋪上個月銷售排名第五的產品如下:
sales_sorted.groupby("store").nth(4)
![003eab76-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_CAbanCAAB6fYPSloQ046.png)
sales_sorted.groupby("store").nth(-2)
![0055b956-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_CAHERfAAET6uc7N2M652.png)
sales.groupby("store",as_index=False).agg( unique_values=("product_code","unique") )
![007b6002-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_GAI9P2AAB1G7R92O4726.png)
sales.groupby("store",as_index=False).agg( number_of_unique_values=("product_code","nunique") )
![0095f980-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_GAH-7mAAA6inbRqCI115.png)
sales.groupby("store").agg( total_sales_in_thousands=( "last_month_sales", lambdax:round(x.sum()/1000,1) ) )
![00af3eb8-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_GASPDKAAA7Hv_3cQk510.png)
sales.groupby("store").apply( lambdax:(x.last_week_sales-x.last_month_sales/4).mean() ) store Daisy5.094149 Rose5.326250 Violet8.965152 dtype:float64
18、dropna
缺省情況下,groupby函數忽略缺失值。如果用于分組的列中缺少一個值,那么它將不包含在任何組中,也不會單獨顯示。所以可以使用dropna參數來改變這個行為。 讓我們首先添加一個缺少存儲值的新行。
sales.loc[1000]=[None,"PG2",10000,120,64,96,15,53]
然后計算帶有dropna參數和不帶有dropna參數的每個商店的平均價格,以查看差異。
sales.groupby("store")["price"].mean() store Daisy69.327426 Rose60.513700 Violet67.808727 Name:price,dtype:float64看看設置了缺失值參數的結果:
sales.groupby("store",dropna=False)["price"].mean() store Daisy69.327426 Rose60.513700 Violet67.808727 NaN96.000000 Name:price,dtype:float64groupby函數的dropna參數,使用pandas版本1.1.0或更高版本。 19、求組的個數 有時需要知道生成了多少組,這可以使用ngroups。
sales.groupby(["store","product_group"]).ngroups 18在商店和產品組列中有18種不同值的不同組合。 20、獲得一個特定分組 get_group函數可獲取特定組并且返回DataFrame。 例如,我們可以獲得屬于存儲“Daisy”和產品組“PG1”的行如下:
aisy_pg1=sales.groupby( ["store","product_group"]).get_group(("Daisy","PG1") ) daisy_pg1.head()
![00bc5cc4-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_GAZ8GzAAFyiV2pIh4935.png)
sales["rank"]=sales.groupby("store"["price"].rank( ascending=False,method="dense" ) sales.head()
![01132df6-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_GAVYdzAAFm8k6HqTg397.png)
importnumpyasnpdf=pd.DataFrame( { "date":pd.date_range(start="2022-08-01",periods=8,freq="D"), "category":list("AAAABBBB"), "value":np.random.randint(10,30,size=8) } )
![014b3282-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_GABAvFAAGKyxKzsMg326.png)
df["cum_sum"]=df.groupby("category")["value"].cumsum()
![016a7a5c-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_GARzXZAAC0uZgq-lc833.png)
df["cum_sum_2"]=df.groupby( "category" )["value"].expanding().sum().values
![01740086-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_GAQLbCAADaEEHYfJg625.png)
df["cum_mean"]=df.groupby( "category" )["value"].expanding().mean().values
![0187744a-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_KATOIZAAKnmu3S1rs892.png)
df["current_highest"]=df.groupby( "category" )["value"].expanding().max().values
![01f61b70-5033-11ed-a3b6-dac502259ad0.png](https://file1.elecfans.com//web2/M00/97/00/wKgZomTnJ_KAV4mPAAEF9bz9XHI684.png)
-
函數
+關注
關注
3文章
4346瀏覽量
62979 -
數據分析
+關注
關注
2文章
1461瀏覽量
34168 -
數據集
+關注
關注
4文章
1209瀏覽量
24835
原文標題:25 個例子學會 Pandas Groupby 操作!
文章出處:【微信號:DBDevs,微信公眾號:數據分析與開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
為什么圖騰柱電路大多數用三極管來實現的呢
為什么現在大多數四軸飛行器都采用的是X型布局
如何解決大多數電源完整性問題
大多數為單指令周期
大多數用戶并不習慣在智能音箱上收聽新聞
為什么大多數加密貨幣沒有存在的必要
![為什么<b class='flag-5'>大多數</b>加密貨幣沒有存在的必要](https://file.elecfans.com/web1/M00/9A/3A/pIYBAF0dZkOAWxxbAACRkHKlYf0463.png)
大多數加密數字貨幣都存在什么問題
大多數企業擔憂5G技術帶來的網絡安全風險
滿足大多數倒計時控件的視圖教程
為何大多數PLC采用ARM架構CPU
大多數人5G隨身WiFi用戶被商家引導,如何避免“劣質”隨身WiFi?
![<b class='flag-5'>大多數</b>人5G隨身WiFi用戶被商家引導,如何避免“劣質”隨身WiFi?](https://file1.elecfans.com/web2/M00/8D/2D/wKgZomS3kLiATzIGAAVXffPWYLI800.png)
評論