25个例子学会Pandas Groupby 操作!
恋习Python
共 9073字,需浏览 19分钟
·
2022-10-08 16:45
来源丨DeepHub IMBA
大家好,我是小F~ groupby是Pandas在数据分析中最常用的函数之一。 它用于根据给定列中的不同值对数据点(即行)进行分组,分组后的数据可以计算生成组的聚合值。如果我们有一个包含汽车品牌和价格信息的数据集,那么可以使用groupby功能来计算每个品牌的平均价格。
![3a362c8bcbec566024ea252d92075311.webp](https://filescdn.proginn.com/db670562c6b7d07a1e37a8a2fd5cf54c/3a362c8bcbec566024ea252d92075311.webp)
import pandas as pd
sales = pd.read_csv("sales_data.csv")
sales.head()
![affd91ba7350459b04681f1e8691c3f5.webp](https://filescdn.proginn.com/cc035867bbf2eff516d234385131d73b/affd91ba7350459b04681f1e8691c3f5.webp)
2、多列聚合 在一个操作中进行多个聚合。以下是我们如何计算每个商店的平均库存数量和价格。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()
![e82d1e5ea7ffe0035f2101be9eb69159.webp](https://filescdn.proginn.com/4e82f73f12d3934a844f574e7cafe070/e82d1e5ea7ffe0035f2101be9eb69159.webp)
sales.groupby("store")["stock_qty"].agg(["mean", "max"])
4、对聚合结果进行命名
在前面的两个示例中,聚合列表示什么还不清楚。例如,“mean”并没有告诉我们它是什么的均值。在这种情况下,我们可以对聚合的结果进行命名。
sales.groupby("store").agg(
avg_stock_qty = ("stock_qty", "mean"),
max_stock_qty = ("stock_qty", "max")
)
![251194958411392dcd8bb638894e2bcc.webp](https://filescdn.proginn.com/2b4c1f9c6aa45ca1e0ab2958084714ff/251194958411392dcd8bb638894e2bcc.webp)
sales.groupby("store")[["stock_qty","price"]].agg(["mean", "max"])
sales.groupby("store").agg(
avg_stock_qty = ("stock_qty", "mean"),
avg_price = ("price", "mean")
)
![a945977d906fff22416f1798d70984c5.webp](https://filescdn.proginn.com/90f3550b443beb0ead066b80013e8711/a945977d906fff22416f1798d70984c5.webp)
sales.groupby("store", as_index=False).agg(
avg_stock_qty = ("stock_qty", "mean"),
avg_price = ("price", "mean")
)
![2b1f76d4fc5a139e2e81bf9b2ccd8a96.webp](https://filescdn.proginn.com/9fca54fbf0b712942c56781d6bf2e2e2/2b1f76d4fc5a139e2e81bf9b2ccd8a96.webp)
sales.groupby(["store","product_group"], as_index=False).agg(
avg_sales = ("last_week_sales", "mean")
).head()
![a702e32e48c9cf6377471401119562f9.webp](https://filescdn.proginn.com/bdd4fd9d8caad2535d8316f261a8a3b7/a702e32e48c9cf6377471401119562f9.webp)
sales.groupby(["store","product_group"], as_index=False).agg( avg_sales = ("last_week_sales", "mean")
).sort_values(by="avg_sales", ascending=False).head()
![59f44c3b8db780c8dd65efd0a8e06cfd.webp](https://filescdn.proginn.com/a941c2e59d656772382f490de4456355/59f44c3b8db780c8dd65efd0a8e06cfd.webp)
11、最小的Top 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)
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)
![cbec110002247cb72aa90bf534c0149d.webp](https://filescdn.proginn.com/5f57c43aa23fb55905b8919505898f92/cbec110002247cb72aa90bf534c0149d.webp)
sales_sorted.groupby("store").nth(-2)
![b177bbfefa73791ca5e5411de31daacf.webp](https://filescdn.proginn.com/2ed96cf25e0606922861a7e683a6f83b/b177bbfefa73791ca5e5411de31daacf.webp)
sales.groupby("store", as_index=False).agg(
unique_values = ("product_code","unique")
)
![39e3fa0ffbe8d975ed82ef3df3913402.webp](https://filescdn.proginn.com/41c8685238e5c41bbee51524f0377988/39e3fa0ffbe8d975ed82ef3df3913402.webp)
sales.groupby("store", as_index=False).agg(
number_of_unique_values = ("product_code","nunique")
)
![6caa7a473cbeb6f9f97a8870dbb0e4fb.webp](https://filescdn.proginn.com/293f801531e23e9940317c70bf333792/6caa7a473cbeb6f9f97a8870dbb0e4fb.webp)
16、Lambda表达式 可以在agg函数中使用lambda表达式作为自定义聚合操作。
sales.groupby("store").agg(
total_sales_in_thousands = (
"last_month_sales",
lambda x: round(x.sum() / 1000, 1)
)
)
![dd1d19407a1965793205de31e908db1b.webp](https://filescdn.proginn.com/518b99889181c18cdbd0df2d21d0db57/dd1d19407a1965793205de31e908db1b.webp)
17、apply函数 使用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
18、dropna 缺省情况下,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
groupby函数的dropna参数,使用pandas版本1.1.0或更高版本。 19、求组的个数 有时需要知道生成了多少组,这可以使用ngroups。dropna=False)["price"].mean()
store
Daisy 69.327426
Rose 60.513700
Violet 67.808727
NaN 96.000000
Name: price, dtype: float64
在商店和产品组列中有18种不同值的不同组合。 20、获得一个特定分组 get_group函数可获取特定组并且返回DataFrame。 例如,我们可以获得属于存储“Daisy”和产品组“PG1”的行如下:sales.groupby(["store", "product_group"]).ngroups
18
aisy_pg1 = sales.groupby(
["Daisy","PG1") ]).get_group((
)
daisy_pg1.head()
![c1fb4a8bd264bec67982645c74032019.webp](https://filescdn.proginn.com/adcfaa641386529e689780894cf5b908/c1fb4a8bd264bec67982645c74032019.webp)
21、rank函数 rank函数用于根据给定列中的值为行分配秩。我们可以使用rank和groupby函数分别对每个组中的行进行排序。
sales["rank"] = sales.groupby("store"["price"].rank(
ascending=False, method="dense"
)
sales.head()
![086d916a8c1c040ec7d75068a971d5c2.webp](https://filescdn.proginn.com/af9f3f2383489c503735ad915cb024b1/086d916a8c1c040ec7d75068a971d5c2.webp)
22、累计操作 们可以计算出每组的累计总和。
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)
}
)
![63e41329b0d59a5d71dbff96cd823612.webp](https://filescdn.proginn.com/6fd7440ba56b8d7b3540cc5b6e87bd57/63e41329b0d59a5d71dbff96cd823612.webp)
df["cum_sum"] = df.groupby("category")["value"].cumsum()
![ce02a9e4029ecaaab6052f587c862b43.webp](https://filescdn.proginn.com/f173667a1d57c4e201925d226fda0f14/ce02a9e4029ecaaab6052f587c862b43.webp)
23、expanding函数 expanding函数提供展开转换。但是对于展开以后的操作还是需要一个累计函数来堆区操作。例如它与cumsum 函数一起使用,结果将与与sum函数相同。
df["cum_sum_2"] = df.groupby(
"category"
)["value"].expanding().sum().values
![086bf645596d46cab49020aeb3b7743e.webp](https://filescdn.proginn.com/b770bfd2efc92945c1abd6bdcfd12b9d/086bf645596d46cab49020aeb3b7743e.webp)
24、累积平均 利用展开函数和均值函数计算累积平均。
df["cum_mean"] = df.groupby(
"category"
)["value"].expanding().mean().values
![f3837a864c9289330f4560ef3324a700.webp](https://filescdn.proginn.com/8a1c71b228795cc5d74e612b7728233b/f3837a864c9289330f4560ef3324a700.webp)
25、展开后的最大值 可以使用expand和max函数记录组当前最大值。
df["current_highest"] = df.groupby(
"category"
)["value"].expanding().max().values
![bc96c3c3f3e3551fda3f9c42a4387aa8.webp](https://filescdn.proginn.com/a05650868a7e76305c662d949c474a22/bc96c3c3f3e3551fda3f9c42a4387aa8.webp)
万水千山总是情,点个 👍 行不行。
评论