新聞中心
大家好,我是菜鳥哥。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對(duì)這個(gè)行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡(jiǎn)單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名、網(wǎng)頁(yè)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、金牛網(wǎng)站維護(hù)、網(wǎng)站推廣。
groupby是Pandas在數(shù)據(jù)分析中最常用的函數(shù)之一。它用于根據(jù)給定列中的不同值對(duì)數(shù)據(jù)點(diǎn)(即行)進(jìn)行分組,分組后的數(shù)據(jù)可以計(jì)算生成組的聚合值。
如果我們有一個(gè)包含汽車品牌和價(jià)格信息的數(shù)據(jù)集,那么可以使用groupby功能來計(jì)算每個(gè)品牌的平均價(jià)格。
在本文中,我們將使用25個(gè)示例來詳細(xì)介紹groupby函數(shù)的用法。這25個(gè)示例中還包含了一些不太常用但在各種任務(wù)中都能派上用場(chǎng)的操作。
這里使用的數(shù)據(jù)集是隨機(jī)生成的,我們把它當(dāng)作一個(gè)銷售的數(shù)據(jù)集。
import pandas as pd
sales = pd.read_csv("sales_data.csv")
sales.head()
1、單列聚合
我們可以計(jì)算出每個(gè)店鋪的平均庫(kù)存數(shù)量如下:
sales.groupby("store")["stock_qty"].mean()
#輸出
store
Daisy 1811.861702
Rose 1677.680000
Violet 14622.406061
Name: stock_qty, dtype: float642、多列聚合
在一個(gè)操作中進(jìn)行多個(gè)聚合。以下是我們?nèi)绾斡?jì)算每個(gè)商店的平均庫(kù)存數(shù)量和價(jià)格。
sales.groupby("store")[["stock_qty","price"]].mean()3、多列多個(gè)聚合
我們還可以使用agg函數(shù)來計(jì)算多個(gè)聚合值。
sales.groupby("store")["stock_qty"].agg(["mean", "max"])4、對(duì)聚合結(jié)果進(jìn)行命名
在前面的兩個(gè)示例中,聚合列表示什么還不清楚。例如,“mean”并沒有告訴我們它是什么的均值。在這種情況下,我們可以對(duì)聚合的結(jié)果進(jìn)行命名。
要聚合的列和函數(shù)名需要寫在元組中。
sales.groupby("store").agg(
avg_stock_qty = ("stock_qty", "mean"),
max_stock_qty = ("stock_qty", "max")
)5、多個(gè)聚合和多個(gè)函數(shù)
sales.groupby("store")[["stock_qty","price"]].agg(["mean", "max"])6、對(duì)不同列的聚合進(jìn)行命名
7、as_index參數(shù)
sales.groupby("store").agg(
avg_stock_qty = ("stock_qty", "mean"),
avg_price = ("price", "mean")
)如果groupby操作的輸出是DataFrame,可以使用as_index參數(shù)使它們成為DataFrame中的一列。
sales.groupby("store", as_index=False).agg(
avg_stock_qty = ("stock_qty", "mean"),
avg_price = ("price", "mean")
)
8、用于分組的多列
就像我們可以聚合多個(gè)列一樣,我們也可以使用多個(gè)列進(jìn)行分組。
sales.groupby(["store","product_group"], as_index=False).agg(
avg_sales = ("last_week_sales", "mean")
).head()
每個(gè)商店和產(chǎn)品的組合都會(huì)生成一個(gè)組。
9、排序輸出
可以使用sort_values函數(shù)根據(jù)聚合列對(duì)輸出進(jìn)行排序。
sales.groupby(["store","product_group"], as_index=False).agg( avg_sales = ("last_week_sales", "mean")
).sort_values(by="avg_sales", ascending=False).head()
這些行根據(jù)平均銷售值按降序排序。
10、最大的Top N
max函數(shù)返回每個(gè)組的最大值。如果我們需要n個(gè)最大的值,可以用下面的方法:
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: int6411、最小的Top N
與最大值相似,也可以求最小值
sales.groupby("store")["last_week_sales"].nsmallest(2)12、第n個(gè)值
除上面2個(gè)以外,還可以找到一組中的第n個(gè)值。
sales_sorted = sales.sort_values(by=["store","last_month_sales"], ascending=False, ignore_index=True)
找到每個(gè)店鋪上個(gè)月銷售排名第五的產(chǎn)品如下:
sales_sorted.groupby("store").nth(4)輸出包含每個(gè)組的第5行。由于行是根據(jù)上個(gè)月的銷售值排序的,所以我們將獲得上個(gè)月銷售額排名第五的行。
13、第n個(gè)值,倒排序
也可以用負(fù)的第n項(xiàng)。例如," nth(-2) "返回從末尾開始的第二行。
sales_sorted.groupby("store").nth(-2)14、唯一值
unique函數(shù)可用于查找每組中唯一的值。例如,可以找到每個(gè)組中唯一的產(chǎn)品代碼如下:
sales.groupby("store", as_index=False).agg(
unique_values = ("product_code","unique")
)15、唯一值的數(shù)量
還可以使用nunique函數(shù)找到每組中唯一值的數(shù)量。
sales.groupby("store", as_index=False).agg(
number_of_unique_values = ("product_code","nunique")
)16、Lambda表達(dá)式
可以在agg函數(shù)中使用lambda表達(dá)式作為自定義聚合操作。
sales.groupby("store").agg(
total_sales_in_thousands = (
"last_month_sales",
lambda x: round(x.sum() / 1000, 1)
)
)
17、apply函數(shù)
使用apply函數(shù)將Lambda表達(dá)式應(yīng)用到每個(gè)組。例如,我們可以計(jì)算每家店上周銷售額與上個(gè)月四分之一銷售額的差值的平均值,如下:
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: float6418、dropna
缺省情況下,groupby函數(shù)忽略缺失值。如果用于分組的列中缺少一個(gè)值,那么它將不包含在任何組中,也不會(huì)單獨(dú)顯示。所以可以使用dropna參數(shù)來改變這個(gè)行為。
讓我們首先添加一個(gè)缺少存儲(chǔ)值的新行。
sales.loc[1000] = [None, "PG2", 10000, 120, 64, 96, 15, 53]
然后計(jì)算帶有dropna參數(shù)和不帶有dropna參數(shù)的每個(gè)商店的平均價(jià)格,以查看差異。
sales.groupby("store")["price"].mean()
store
Daisy 69.327426
Rose 60.513700
Violet 67.808727
Name: price, dtype: float64看看設(shè)置了缺失值參數(shù)的結(jié)果:
sales.groupby("store", dropna=False)["price"].mean()
store
Daisy 69.327426
Rose 60.513700
Violet 67.808727
NaN 96.000000
Name: price, dtype: float64groupby函數(shù)的dropna參數(shù),使用pandas版本1.1.0或更高版本。
19、求組的個(gè)數(shù)
有時(shí)需要知道生成了多少組,這可以使用ngroups。
sales.groupby(["store", "product_group"]).ngroups
18
在商店和產(chǎn)品組列中有18種不同值的不同組合。
20、獲得一個(gè)特定分組
get_group函數(shù)可獲取特定組并且返回DataFrame。
例如,我們可以獲得屬于存儲(chǔ)“Daisy”和產(chǎn)品組“PG1”的行如下:
aisy_pg1 = sales.groupby(
["store", "product_group"]).get_group(("Daisy","PG1")
)
daisy_pg1.head()
21、rank函數(shù)
rank函數(shù)用于根據(jù)給定列中的值為行分配秩。我們可以使用rank和groupby函數(shù)分別對(duì)每個(gè)組中的行進(jìn)行排序。
sales["rank"] = sales.groupby("store"["price"].rank(
ascending=False, method="dense"
)
sales.head()22、累計(jì)操作
們可以計(jì)算出每組的累計(jì)總和。
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)
}
)
我們可以單獨(dú)創(chuàng)建一個(gè)列,包含值列的累計(jì)總和,如下所示:
df["cum_sum"] = df.groupby("category")["value"].cumsum()23、expanding函數(shù)
expanding函數(shù)提供展開轉(zhuǎn)換。但是對(duì)于展開以后的操作還是需要一個(gè)累計(jì)函數(shù)來堆區(qū)操作。例如它與cumsum 函數(shù)一起使用,結(jié)果將與與sum函數(shù)相同。
df["cum_sum_2"] = df.groupby(
"category"
)["value"].expanding().sum().values
24、累積平均
利用展開函數(shù)和均值函數(shù)計(jì)算累積平均。
df["cum_mean"] = df.groupby(
"category"
)["value"].expanding().mean().values
25、展開后的最大值
可以使用expand和max函數(shù)記錄組當(dāng)前最大值。
df["current_highest"] = df.groupby(
"category"
)["value"].expanding().max().values
在Pandas中g(shù)roupby函數(shù)與aggregate函數(shù)共同構(gòu)成了高效的數(shù)據(jù)分析工具。在本文中所做的示例涵蓋了groupby功能的大多數(shù)用例,希望對(duì)你有所幫助。
新聞標(biāo)題:25個(gè)例子學(xué)會(huì)PandasGroupby操作!
文章網(wǎng)址:http://m.fisionsoft.com.cn/article/dpsisdp.html


咨詢
建站咨詢
