Pandas & NumPy Academy · 课时

agg() 方法

使用 agg() 一次应用多个聚合函数,并传入字典为不同列计算不同统计量。

第 3 / 4 课13 个步骤

agg() 方法 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

为什么使用 agg()?

直接对 GroupBy 对象调用 sum() 或 mean() 只能得到一个统计量。但实际分析通常需要同时计算多个统计量——例如每个地区的收入总额、平均订单金额和订单数量。agg() 方法(aggregate 的缩写)可以通过一次高效调用完成所有这些计算,而不必分别执行聚合后再合并结果。

传递函数名列表

agg() 最简单的用法是传递一个由函数名字符串组成的列表。Pandas 会将每个函数应用于选定的列,并返回一个 DataFrame,其中每列对应一个函数。这种方式适用于任何内置聚合名称:'sum'、'mean'、'min'、'max'、'count'、'std'、'median' 等。

import pandas as pd

df = pd.DataFrame({
    'region': ['East', 'West', 'East', 'West', 'East', 'West'],
    'revenue': [200, 340, 150, 290, 310, 410],
    'units':   [20,   35,  15,  30,  28,  40]
})

result = df.groupby('region')['revenue'].agg(['sum', 'mean', 'count', 'max'])
print(result)
#          sum        mean  count  max
# region
# East     660  220.000000      3  310
# West    1040  346.666667      3  410

使用命名聚合重命名输出列

传递字符串列表时,输出列会以函数本身命名('sum'、'mean' 等)。为了得到更清晰的输出,请使用命名聚合:传递关键字参数,其中键是您希望使用的列名,值是由 (column, function) 组成的元组。这是现代 Pandas 推荐的方式,可以生成自解释的代码。

result = df.groupby('region').agg(
    total_revenue=('revenue', 'sum'),
    avg_revenue=('revenue', 'mean'),
    order_count=('revenue', 'count'),
    max_order=('revenue', 'max')
)
print(result)
#         total_revenue  avg_revenue  order_count  max_order
# region
# East              660   220.000000            3        310
# West             1040   346.666667            3        410

为不同列使用不同函数

您可以向 agg() 传递一个字典,其中每个键是列名,每个值是应用于该列的函数(或函数列表)。这样,您就可以在一次 GroupBy 调用中对 revenue 计算 sum,同时对 units 计算 mean。

result = df.groupby('region').agg({
    'revenue': ['sum', 'mean'],
    'units':   ['sum', 'max']
})
print(result)
#        revenue             units
#            sum        mean   sum max
# region
# East       660  220.000000    63  28
# West      1040  346.666667   105  40

使用字典 agg() 生成列 MultiIndex

当您为某列传递多个函数时,结果的列索引会是一个 MultiIndex。第一层是原始列名,第二层是函数名。您可以使用列表推导式将这些列名展平为单个字符串,使结果更便于后续处理。

result = df.groupby('region').agg({'revenue': ['sum', 'mean'], 'units': 'sum'})

# Flatten MultiIndex columns
result.columns = ['_'.join(c).strip() for c in result.columns]
print(result.columns.tolist())
# ['revenue_sum', 'revenue_mean', 'units_sum']

在 agg() 中使用自定义函数

除了字符串名称外,您还可以向 agg() 传递任意可调用的 Python 对象。该函数会接收一个 Series(即某个组中该列的值),并且必须返回一个标量。您可以传递 lambda 或命名函数。自定义函数更加灵活,但速度比内置命名函数慢,因为它们无法使用 C 层面的优化。

def revenue_range(s):
    return s.max() - s.min()

result = df.groupby('region')['revenue'].agg(['sum', revenue_range])
print(result)
#          sum  revenue_range
# region
# East     660            160
# West    1040            120

使用自定义函数进行命名聚合

命名聚合语法同样适用于可调用函数,而不仅仅是字符串名称。只需将 (column, function) 这样的元组作为关键字参数值传入,其中 function 可以是任何接收一个 Series 并返回标量的可调用对象。即使需要将内置逻辑与自定义逻辑混合使用,这种写法也能让代码保持易读。

result = df.groupby('region').agg(
    total=('revenue', 'sum'),
    spread=('revenue', lambda s: s.max() - s.min()),
    top_units=('units', 'max')
)
print(result)
#         total  spread  top_units
# region
# East      660     160         28
# West     1040     120         40

不选择列进行聚合

如果您在未选择特定列的情况下对 GroupBy 调用 agg(),Pandas 会将该函数应用于 DataFrame 中的每个数值列。这是在一次操作中获取所有数值列摘要的快捷方式。请注意,在大多数聚合操作中,非数值数据类型的列会被静默跳过。

# Aggregate all numeric columns in one call
result = df.groupby('region').agg(['sum', 'mean'])
print(result)
#        revenue              units
#            sum        mean    sum   mean
# region
# East       660  220.000000     63  21.00
# West      1040  346.666667    105  35.00

将 agg() 与 reset_index() 结合使用

调用 agg() 后,分组列会成为索引。常见做法是立即调用 reset_index(),以获得一个扁平的 DataFrame,其中分组键是普通列。之后,您可以像处理其他 DataFrame 一样重命名、排序和筛选结果,从而轻松将其传递给后续流程或导出。

summary = (
    df.groupby('region')
      .agg(total=('revenue', 'sum'), orders=('revenue', 'count'))
      .reset_index()
      .sort_values('total', ascending=False)
)
print(summary)
#   region  total  orders
# 1   West   1040       3
# 0   East    660       3

agg()、transform() 与 apply() 的比较

区分这三种 GroupBy 方法非常重要:agg() 会将每个组缩减为一个标量,因此结果行数少于原始数据。transform() 返回与输入形状相同的数组,因此您可以将组级统计数据添加为新列。apply() 的灵活性最高,但速度也最慢,下一课将详细介绍它。

# agg: one row per group
print(df.groupby('region')['revenue'].agg('mean'))
# region
# East    220.0
# West    346.7

# transform: one row per original row (group mean broadcast back)
df['group_mean'] = df.groupby('region')['revenue'].transform('mean')
print(df[['region', 'revenue', 'group_mean']].head())

实践示例:销售摘要

下面是一个贴近实际的端到端示例:计算一张销售摘要表,其中包含总收入、平均订单金额、订单数量以及每个地区的收入范围;设置清晰的列名,并按总收入降序排列。这种模式可直接应用于产品、财务和营销分析流程。

summary = (
    df.groupby('region')
      .agg(
          total_revenue=('revenue', 'sum'),
          avg_order=('revenue', 'mean'),
          num_orders=('revenue', 'count'),
          revenue_range=('revenue', lambda s: s.max() - s.min())
      )
      .reset_index()
      .sort_values('total_revenue', ascending=False)
      .round(2)
)
print(summary)

快速检查

检验您对本课 agg() 方法的理解。

课程回顾

本课您学习了:如何使用 agg() 一次计算多个聚合结果,如何使用命名聚合设置清晰的列名,以及如何使用字典对不同列应用不同函数。接下来我们将学习 transform() 和 filter(),它们可以将组级信息添加回原始 DataFrame。

免费开始

用 AI 导师学习 Python — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「agg() 方法」课时是免费的吗?

是的 — 「agg() 方法」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「agg() 方法」这节课中我会学到什么?

使用 agg() 一次应用多个聚合函数,并传入字典为不同列计算不同统计量。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「agg() 方法」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 拆分—应用—合并模式
  2. 使用单个和多个键进行 GroupBy
  3. agg() 方法
  4. GroupBy 变换与筛选
← 返回 Pandas & NumPy Academy