來源丨DeepHub IMBA
groupby是Pandas在數據分析中最常用的函數之一。它用於根據給定列中的不同值對數據點(即行)進行分組,分組後的數據可以計算生成組的聚合值。如果我們有一個包含汽車品牌和價格信息的數據集,那麼可以使用groupby功能來計算每個品牌的平均價格。在本文中,我們將使用25個示例來詳細介紹groupby函數的用法。這25個示例中還包含了一些不太常用但在各種任務中都能派上用場的操作。這裡使用的數據集是隨機生成的,我們把它當作一個銷售的數據集。 import pandas as pd sales = pd.read_csv("sales_data.csv") sales.head() sales.groupby("store")["stock_qty"].mean() #輸出 store Daisy 1811.861702 Rose 1677.680000 Violet 14622.406061 Name: stock_qty, dtype: float64在一個操作中進行多個聚合。以下是我們如何計算每個商店的平均庫存數量和價格。 sales.groupby("store")[["stock_qty","price"]].mean() sales.groupby("store")["stock_qty"].agg(["mean", "max"])在前面的兩個示例中,聚合列表示什麼還不清楚。例如,「mean」並沒有告訴我們它是什麼的均值。在這種情況下,我們可以對聚合的結果進行命名。 sales.groupby("store").agg( avg_stock_qty = ("stock_qty", "mean"), max_stock_qty = ("stock_qty", "max") ) sales.groupby("store")[["stock_qty","price"]].agg(["mean", "max"]) sales.groupby("store").agg( avg_stock_qty = ("stock_qty", "mean"), avg_price = ("price", "mean") )如果groupby操作的輸出是DataFrame,可以使用as_index參數使它們成為DataFrame中的一列。 sales.groupby("store", as_index=False).agg( avg_stock_qty = ("stock_qty", "mean"), avg_price = ("price", "mean") )就像我們可以聚合多個列一樣,我們也可以使用多個列進行分組。 sales.groupby(["store","product_group"], as_index=False).agg( avg_sales = ("last_week_sales", "mean") ).head()可以使用sort_values函數根據聚合列對輸出進行排序。 sales.groupby(["store","product_group"], as_index=False).agg( avg_sales = ("last_week_sales", "mean") ).sort_values(by="avg_sales", ascending=False).head()max函數返回每個組的最大值。如果我們需要n個最大的值,可以用下面的方法: sales.groupby("store")["last_week_sales"].nlargest(2) store Daisy 413 1883 231 947 Rose 948 883 263 623 Violet 991 3222 339 2690 Name: last_week_sales, dtype: int64 sales.groupby("store")["last_week_sales"].nsmallest(2) sales_sorted = sales.sort_values(by=["store","last_month_sales"], ascending=False, ignore_index=True) sales_sorted.groupby("store").nth(4)輸出包含每個組的第5行。由於行是根據上個月的銷售值排序的,所以我們將獲得上個月銷售額排名第五的行。也可以用負的第n項。例如," nth(-2) "返回從末尾開始的第二行。 sales_sorted.groupby("store").nth(-2)unique函數可用於查找每組中唯一的值。例如,可以找到每個組中唯一的產品代碼如下: sales.groupby("store", as_index=False).agg( unique_values = ("product_code","unique") )還可以使用nunique函數找到每組中唯一值的數量。 sales.groupby("store", as_index=False).agg( number_of_unique_values = ("product_code","nunique") )可以在agg函數中使用lambda表達式作為自定義聚合操作。 sales.groupby("store").agg( total_sales_in_thousands = ( "last_month_sales", lambda x: round(x.sum() / 1000, 1) ) )使用apply函數將Lambda表達式應用到每個組。例如,我們可以計算每家店上周銷售額與上個月四分之一銷售額的差值的平均值,如下: sales.groupby("store").apply( lambda x: (x.last_week_sales - x.last_month_sales / 4).mean() ) store Daisy 5.094149 Rose 5.326250 Violet 8.965152 dtype: float64缺省情況下,groupby函數忽略缺失值。如果用於分組的列中缺少一個值,那麼它將不包含在任何組中,也不會單獨顯示。所以可以使用dropna參數來改變這個行為。 sales.loc[1000] = [None, "PG2", 10000, 120, 64, 96, 15, 53]然後計算帶有dropna參數和不帶有dropna參數的每個商店的平均價格,以查看差異。 sales.groupby("store")["price"].mean() store Daisy 69.327426 Rose 60.513700 Violet 67.808727 Name: price, dtype: float64 sales.groupby("store", dropna=False)["price"].mean() store Daisy 69.327426 Rose 60.513700 Violet 67.808727 NaN 96.000000 Name: price, dtype: float64groupby函數的dropna參數,使用pandas版本1.1.0或更高版本。有時需要知道生成了多少組,這可以使用ngroups。 sales.groupby(["store", "product_group"]).ngroups 18get_group函數可獲取特定組並且返回DataFrame。例如,我們可以獲得屬於存儲「Daisy」和產品組「PG1」的行如下: aisy_pg1 = sales.groupby( ["store", "product_group"]).get_group(("Daisy","PG1") ) daisy_pg1.head()rank函數用於根據給定列中的值為行分配秩。我們可以使用rank和groupby函數分別對每個組中的行進行排序。 sales["rank"] = sales.groupby("store"["price"].rank( ascending=False, method="dense" ) sales.head() import numpy as npdf = 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) } )我們可以單獨創建一個列,包含值列的累計總和,如下所示: df["cum_sum"] = df.groupby("category")["value"].cumsum()expanding函數提供展開轉換。但是對於展開以後的操作還是需要一個累計函數來堆區操作。例如它與cumsum 函數一起使用,結果將與與sum函數相同。 df["cum_sum_2"] = df.groupby( "category" )["value"].expanding().sum().values df["cum_mean"] = df.groupby( "category" )["value"].expanding().mean().values可以使用expand和max函數記錄組當前最大值。 df["current_highest"] = df.groupby( "category" )["value"].expanding().max().values在Pandas中groupby函數與aggregate函數共同構成了高效的數據分析工具。在本文中所做的示例涵蓋了groupby功能的大多數用例,希望對你有所幫助。點這裡👇關注我,記得標星哦~







鑽石舞台 發表在 痞客邦 留言(0) 人氣()