pandas-groupby常见用法

groupby过程图解

​ 总的来说,groupby的过程就是将原有的DataFrame按照groupby的字段(这里是company),划分为若干个分组DataFrame,被分为多少个组就有多少个分组DataFrame。所以说,在groupby之后的一系列操作(如aggapply等),均是基于子DataFrame的操作。理解了这点,也就基本摸清了Pandas中groupby操作的主要原理。下面来讲讲groupby之后的常见操作。

内容参考自 知乎-Pandas之超好用的Groupby用法详解

在这里插入图片描述

8个常见用法

代码地址(可在线预览)💻📲

pandas-groupby常见用法-github

pandas-groupby常见用法-gitee

加载 sklearn-鸢尾花 公开数据集

import pandas as pd
from sklearn import datasets

# 加载数据集和目标
data, target = datasets.load_iris(return_X_y=True, as_frame=True)
# 合并数据集和目标
iris = pd.concat([data, target], axis=1, sort=False)
iris

在这里插入图片描述

生成groupby对象

iris_gb = iris.groupby('target')
type(iris_gb)

pandas.core.groupby.generic.DataFrameGroupBy

1. 创建频率表

​ 假如我想知道每个species类中的数量有多少,那么直接使用groupby的size函数即可

iris_gb.size()

在这里插入图片描述

2. 计算常用的描述统计量

min、max()、medianhe、std等

# 计算均值
iris_gb.mean()

在这里插入图片描述

# 单列
iris_gb['sepal length (cm)'].mean()

在这里插入图片描述

# 双列
iris_gb[['sepal length (cm)', 'sepal width (cm)']].mean()

在这里插入图片描述

3. 查找最大值(最小值)索引

# 查找每个组的最大值或最小值的索引
iris_gb.idxmax()

在这里插入图片描述

# 查找每组sepal_length最大值对应的整条记录时,就可以这样用。注意,这里是整条记录,相当于按sepal_length最大值这个条件进行了筛选。
sepal_largest = iris.loc[iris_gb['sepal length (cm)'].idxmax()]
sepal_largest

在这里插入图片描述

4. groupby后重置索引

很多时候,在groupby处理后还要进行其他操作。也就是说,我们想重置分组索引以使其成为正常的行和列。 第一种方法可能大家常用,就是通过reset_index()让乱序索引重置。

iris_gb.max().reset_index()

在这里插入图片描述

但其实,还有一个看上去更加友好的用法。可以在groupby的时候就设置as_index参数,也可以达到同样效果。

iris.groupby('target', as_index=False).max()

在这里插入图片描述

5. 多种统计量汇总

上面都是单个统计量的操作,那如果我想同时操作好几个呢?

groupby还有一个超级棒的用法就是和聚合函数agg连起来使用。

iris_gb[['sepal length (cm)', 'sepal width (cm)']].agg(["min", "mean"])

在这里插入图片描述

6. 特定列的聚合

上面是的多个操作对于每个列都是一样的。实际使用过程中,我们可能对于每个列的需求都是不一样的。

所以在这种情况下,可以通过为不同的列单独设置不同的统计量。

iris_gb.agg({"sepal length (cm)": ["min", "max"], "sepal width (cm)": ["mean", "std"]})

在这里插入图片描述

7. NamedAgg命名统计量

上面的多级索引看起来有点不太友好,我想把每个列下面的统计量和列名分别合并起来。可以使用NamedAgg来完成列的命名。

iris_gb.agg(
     sepal_min=pd.NamedAgg(column="sepal length (cm)", aggfunc="min"),
     sepal_max=pd.NamedAgg(column="sepal length (cm)", aggfunc="max"),
     petal_mean=pd.NamedAgg(column="petal length (cm)", aggfunc="mean"),
     petal_std=pd.NamedAgg(column="petal length (cm)", aggfunc="std")
 )

在这里插入图片描述

因为NamedAgg是一个元组,所以我们也可以直接赋值元组给新的命名,效果一样,但看上去更简洁。

iris_gb.agg(
    sepal_min=("sepal length (cm)", "min"),
    sepal_max=("sepal length (cm)", "max"),
    petal_mean=("petal length (cm)", "mean"),
    petal_std=("petal length (cm)", "std")
)

在这里插入图片描述

8. 使用自定义函数

上面agg聚合函数中我们都是通过添加一个统计量名称来完成操作的,除此之外我们也可直接给一个功能对象。

iris_gb.agg(pd.Series.mean)

在这里插入图片描述

不仅如此,名称和功能对象也可一起使用。

iris_gb.agg(["min", pd.Series.mean])

在这里插入图片描述

还可以自定义函数

def double_length(x):
    return 2*x.mean()

iris_gb.agg(double_length)

在这里插入图片描述

如果想更简洁,也可以使用lambda函数。总之,用法非常灵活,可以自由组合搭配。

iris_gb.agg(lambda x: x.mean())

在这里插入图片描述

### Pandas `groupby` 使用教程 #### 1. 基本概念 Pandas 提供了一个强大的工具——`groupby()` 函数,用于对数据集按照指定条件进行分组并执行操作。这种功能通常被称为 **split-apply-combine** 流程[^2]。 #### 2. 基础语法 以下是 `groupby` 的基本用法: ```python import pandas as pd df = pd.DataFrame({ 'Category': ['A', 'B', 'C', 'A', 'B'], 'Value': [10, 20, 30, 40, 50], }) # 按照 Category 列进行分组,并计算每组 Value 列的均值 result = df.groupby('Category')['Value'].mean() print(result) ``` #### 3. 高级应用 当遇到复杂场景时,可以借助其他函数来增强 `groupby` 功能: ##### (1) `agg` 允许一次性调用多个聚合函数。 ```python aggregated_result = df.groupby('Category').agg(['sum', 'mean']) print(aggregated_result) ``` 此方法适用于需要同时获取多种统计量的情况[^1]。 ##### (2) `transform` 返回一个与原始 DataFrame 形状相同的对象,其中每一项都是基于对应组的操作结果。 ```python transformed_df = df.copy() transformed_df['Mean'] = transformed_df.groupby('Category')['Value'].transform('mean') print(transformed_df) ``` ##### (3) `apply` 支持自定义逻辑处理各组的数据。 ```python def custom_function(group): return group.max() - group.min() applied_result = df.groupby('Category')['Value'].apply(custom_function) print(applied_result) ``` #### 4. 获取特定组 如果希望访问某个具体的分组,则可利用 `get_group` 方法[^4]。 ```python specific_group = df.groupby('Category').get_group('A') print(specific_group) ``` #### 5. 错误排查 开发过程中可能会遭遇一些常见错误,比如因数据类型不一致引发异常等问题。此时需注意检查输入数据的一致性和完整性[^3]。 --- ###
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值