网易首页 > 网易号 > 正文 申请入驻

25个例子学会Pandas Groupby 操作

0
分享至

groupby是Pandas在数据分析中最常用的函数之一。它用于根据给定列中的不同值对数据点(即行)进行分组,分组后的数据可以计算生成组的聚合值。

如果我们有一个包含汽车品牌和价格信息的数据集,那么可以使用groupby功能来计算每个品牌的平均价格。

在本文中,我们将使用25个示例来详细介绍groupby函数的用法。这25个示例中还包含了一些不太常用但在各种任务中都能派上用场的操作。

这里使用的数据集是随机生成的,我们把它当作一个销售的数据集。

import pandas as pd
sales = pd.read_csv("sales_data.csv")
sales.head()

1、单列聚合

我们可以计算出每个店铺的平均库存数量如下:

sales.groupby("store")["stock_qty"].mean()
#输出
store
Daisy 1811.861702
Rose 1677.680000
Violet 14622.406061
Name: stock_qty, dtype: float64

2、多列聚合

在一个操作中进行多个聚合。以下是我们如何计算每个商店的平均库存数量和价格。

sales.groupby("store")[["stock_qty","price"]].mean()

3、多列多个聚合

我们还可以使用agg函数来计算多个聚合值。

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")
)

要聚合的列和函数名需要写在元组中。

5、多个聚合和多个函数

sales.groupby("store")[["stock_qty","price"]].agg(["mean", "max"])

6、对不同列的聚合进行命名

sales.groupby("store").agg(
avg_stock_qty = ("stock_qty", "mean"),
avg_price = ("price", "mean")
)

7、as_index参数

如果groupby操作的输出是DataFrame,可以使用as_index参数使它们成为DataFrame中的一列。

sales.groupby("store", as_index=False).agg(
avg_stock_qty = ("stock_qty", "mean"),
avg_price = ("price", "mean")
)

8、用于分组的多列

就像我们可以聚合多个列一样,我们也可以使用多个列进行分组。

sales.groupby(["store","product_group"], as_index=False).agg(
avg_sales = ("last_week_sales", "mean")
).head()

每个商店和产品的组合都会生成一个组。

9、排序输出

可以使用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()

这些行根据平均销售值按降序排序。

10、最大的Top N

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

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)

输出包含每个组的第5行。由于行是根据上个月的销售值排序的,所以我们将获得上个月销售额排名第五的行。

13、第n个值,倒排序

也可以用负的第n项。例如," nth(-2) "返回从末尾开始的第二行。

sales_sorted.groupby("store").nth(-2)

14、唯一值

unique函数可用于查找每组中唯一的值。例如,可以找到每个组中唯一的产品代码如下:

sales.groupby("store", as_index=False).agg(
unique_values = ("product_code","unique")
)

15、唯一值的数量

还可以使用nunique函数找到每组中唯一值的数量。

sales.groupby("store", as_index=False).agg(
number_of_unique_values = ("product_code","nunique")
)

16、Lambda表达式

可以在agg函数中使用lambda表达式作为自定义聚合操作。

sales.groupby("store").agg(
total_sales_in_thousands = (
"last_month_sales",
lambda x: round(x.sum() / 1000, 1)
)
)

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

看看设置了缺失值参数的结果:

sales.groupby("store", dropna=False)["price"].mean()
store
Daisy 69.327426
Rose 60.513700
Violet 67.808727
NaN 96.000000
Name: price, dtype: float64

groupby函数的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()

21、rank函数

rank函数用于根据给定列中的值为行分配秩。我们可以使用rank和groupby函数分别对每个组中的行进行排序。

sales["rank"] = sales.groupby("store"["price"].rank(
ascending=False, method="dense"
)
sales.head()

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)
}
)

我们可以单独创建一个列,包含值列的累计总和,如下所示:

df["cum_sum"] = df.groupby("category")["value"].cumsum()

23、expanding函数

expanding函数提供展开转换。但是对于展开以后的操作还是需要一个累计函数来堆区操作。例如它与cumsum 函数一起使用,结果将与与sum函数相同。

df["cum_sum_2"] = df.groupby(
"category"
)["value"].expanding().sum().values

24、累积平均

利用展开函数和均值函数计算累积平均。

df["cum_mean"] = df.groupby(
"category"
)["value"].expanding().mean().values

25、展开后的最大值

可以使用expand和max函数记录组当前最大值。

df["current_highest"] = df.groupby(
"category"
)["value"].expanding().max().values

在Pandas中groupby函数与aggregate函数共同构成了高效的数据分析工具。在本文中所做的示例涵盖了groupby功能的大多数用例,希望对你有所帮助。

https://avoid.overfit.cn/post/eb6cd15ec5134397842f580f383ac712

作者:Soner Yıldırım

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
把瑜伽裤穿成日常的松弛感美女

把瑜伽裤穿成日常的松弛感美女

只要高兴就好
2026-04-13 14:30:30
燃气公司上门安检,根本不是查漏气!真正目的其实是这3个

燃气公司上门安检,根本不是查漏气!真正目的其实是这3个

李博世财经
2026-04-16 14:04:21
日本家庭主妇:古濑玲安!韵味十足,尽显成熟之美

日本家庭主妇:古濑玲安!韵味十足,尽显成熟之美

只要高兴就好
2026-04-16 14:22:51
对传播效果不满!魏建军在发布会现场怒批魏牌高管

对传播效果不满!魏建军在发布会现场怒批魏牌高管

新浪财经
2026-04-19 02:07:52
男演员千万别整容!钟汉良新剧里的男四号,脸颊歪的真让人出戏

男演员千万别整容!钟汉良新剧里的男四号,脸颊歪的真让人出戏

往史过眼云烟
2026-04-16 14:43:01
苏超一家独大,多少地方文旅成了陪跑?

苏超一家独大,多少地方文旅成了陪跑?

环球旅讯
2026-04-17 08:08:52
7308人!26届南方电网录用情况汇总!

7308人!26届南方电网录用情况汇总!

新浪财经
2026-04-18 21:14:07
俄外长到访不到12小时,特朗普就急了:他怕中俄联手掀翻棋盘

俄外长到访不到12小时,特朗普就急了:他怕中俄联手掀翻棋盘

通文知史
2026-04-18 08:15:03
未公开的1972年尼克松访华全套高清照

未公开的1972年尼克松访华全套高清照

深度知局
2026-04-15 00:16:09
越南一家企业遭全厂断电,生产线停摆!只因供电方换了个名,“卡壳”被迫启动发电机,开启最低生存模式

越南一家企业遭全厂断电,生产线停摆!只因供电方换了个名,“卡壳”被迫启动发电机,开启最低生存模式

越南语学习平台
2026-04-18 09:31:13
中超第6轮观众人数:梭鱼湾最高;场均超3万人

中超第6轮观众人数:梭鱼湾最高;场均超3万人

懂球帝
2026-04-18 23:07:58
光通信下一个龙头,已经浮出水面

光通信下一个龙头,已经浮出水面

普陀动物世界
2026-04-19 02:34:25
朱芳雨:很遗憾没能用胜利答谢球迷,希望季后赛能得到大家支持

朱芳雨:很遗憾没能用胜利答谢球迷,希望季后赛能得到大家支持

懂球帝
2026-04-18 23:29:08
麦当娜:睡过100+猛男,2段婚姻全败,如今又恋上儿子29岁教练

麦当娜:睡过100+猛男,2段婚姻全败,如今又恋上儿子29岁教练

七阿姨爱八卦
2026-04-15 17:12:30
果不其然,马英九受访细节披露,廖继斌直指萧旭岑原因曝光

果不其然,马英九受访细节披露,廖继斌直指萧旭岑原因曝光

呼呼历史论
2026-04-18 20:36:14
好意思拿600万?7中2仅5分+正负值最低,球迷:赶紧退役去拍VLOG

好意思拿600万?7中2仅5分+正负值最低,球迷:赶紧退役去拍VLOG

弄月公子
2026-04-18 10:46:15
同样衣服为什这位阿姨穿起来,就这么有女人味,有高级感

同样衣服为什这位阿姨穿起来,就这么有女人味,有高级感

牛弹琴123456
2026-04-17 08:51:44
专家呼吁:马上停用5种调味酱,它是肠癌催化剂!再下饭也别沾

专家呼吁:马上停用5种调味酱,它是肠癌催化剂!再下饭也别沾

路医生健康科普
2026-04-18 16:18:55
西班牙学者:中国已从“世界工厂”变为“全球竞争者”

西班牙学者:中国已从“世界工厂”变为“全球竞争者”

参考消息
2026-04-18 18:20:05
网飞重拍查理和巧克力工厂,为什么非要选"最保险"的画风?

网飞重拍查理和巧克力工厂,为什么非要选"最保险"的画风?

追星雷达站
2026-04-17 08:16:46
2026-04-19 08:56:49
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
1975文章数 1461关注度
往期回顾 全部

科技要闻

传Meta下月拟裁8000 大举清退人力为AI腾位

头条要闻

女子与情人在车上发生关系后被杀 还被灌农药伪造殉情

头条要闻

女子与情人在车上发生关系后被杀 还被灌农药伪造殉情

体育要闻

时隔25年重返英超!没有人再嘲笑他了

娱乐要闻

刘德华回应潘宏彬去世,拒谈丧礼细节

财经要闻

华谊兄弟,8年亏光85亿

汽车要闻

奇瑞威麟R08 PRO正式上市 售价14.48万元起

态度原创

房产
健康
游戏
旅游
时尚

房产要闻

官宣签约最强城更!海口楼市,突然杀入神秘房企!

干细胞抗衰4大误区,90%的人都中招

让老粥批直呼“计划有变”的岁兽代理人,到底是什么东西?

旅游要闻

贵州湄潭:从卖茶叶到卖体验,一片茶叶如何“玩”出新业态?

选对发型,真的能少走很多变美弯路

无障碍浏览 进入关怀版