Pandas聚合与分组运算实战:从内置函数到自定义处理

木白
木白
发布时间:2026-10-11| 1人浏览过
原创

本文深入解析Pandas中的聚合与分组运算。通过groupby实现数据分组,利用内置函数(如sum、mean)进行快速统计,并掌握使用agg()执行自定义聚合逻辑。文章还演示了多函数应用、列级指定运算、结果前缀添加,以及merge与transform在数据对齐与合并中的具体操作。

数据准备与分组基础

在进行聚合运算前,首先需要构建包含分类键(Key)与数值数据的数据集。利用 numpy 生成随机整数,结合字典结构创建 pandas.DataFrame 对象,是处理此类问题的标准起手式。

import numpy as np
import pandas as pd

# 构建包含分类键与数值列的数据集
dict_data = {
  'key1': ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'],
  'key2': ['one', 'two', 'three', 'one', 'two', 'three', 'one', 'two'],
  'data1': np.random.randint(1, 10, 8),
  'data2': np.random.randint(1, 10, 8)
}

df = pd.DataFrame(dict_data)
print(df)

创建完成后,使用 groupby('key1') 指定分组依据,即可对数据进行聚合操作。例如,直接调用 .sum() 即可按 key1 的类别对数值列求和。

# 按 key1 分组并计算总和
df_grouped = df.groupby('key1').sum()
print(df_grouped)

内置聚合函数的应用

Pandas 提供了丰富的内置聚合函数,可直接作用于 groupby 对象。这些函数包括求和(sum)、最大值(max)、最小值(min)、均值(mean)、计数(size)以及描述性统计(describe)等。

# 演示多种内置聚合函数
print(df.groupby('key1').sum())
print('*'*50)
print(df.groupby('key1').max())
print('*'*50)
print(df.groupby('key1').min())
print('*'*50)
print(df.groupby('key1').mean())
print('*'*50)
print(df.groupby('key1').size())
print('*'*50)
# 统计非 NaN 数据的数量
print(df.groupby('key1').count())
print('*'*50)
print(df.groupby('key1').describe())

自定义聚合与 agg() 函数

当内置函数无法满足需求时,可以使用 agg() 函数传入自定义逻辑。自定义函数接收分组后的 DataFrame 或 Series,并返回聚合结果。

定义自定义聚合函数

以下示例定义了一个计算“极差平方差”的函数,并通过 agg() 应用:

# 自定义聚合函数:计算最大值平方与最小值平方的差
def peak_range(df):
    return df.max()**2 - df.min()**2

# 使用 agg 应用自定义函数
print(df.groupby('key1').agg(peak_range))

# 使用 lambda 表达式进行更简单的聚合
print(df.groupby('key1').agg(lambda df: df.max() - df.min()))

多函数应用与列索引重命名

在 agg() 中传入列表,可同时应用多个聚合函数。此时,结果 DataFrame 的列索引将自动包含函数名。若需自定义列名,可采用元组格式 ('新列名', 函数)。

# 应用多个聚合函数,并通过元组重命名特定列
print(df.groupby('key1').agg(['sum', 'std', 'mean', ('range', peak_range)]))

指定列的特定聚合函数

利用字典格式,可以为不同的数值列指定不同的聚合逻辑:

# 指定 data1 使用 mean,data2 使用 sum
print(df.groupby('key1').agg({'data1': 'mean', 'data2': 'sum'}))

结果处理与数据合并

聚合后的数据通常索引为分组键,若需将其与原始数据关联,需进行列名前缀处理及合并操作。

添加前缀与合并数据

使用 add_prefix() 为聚合结果的列名添加前缀,可避免合并时的列名冲突。随后通过 pd.merge() 将原始数据与聚合结果按分组键连接。

# 创建示例数据
dict_data = {
  'key1': ['a', 'b', 'c', 'd', 'a', 'b', 'c', 'd'],
  'key2': ['one', 'two', 'three', 'one', 'two', 'three', 'one', 'two'],
  'data1': np.random.randint(1, 10, 8),
  'data2': np.random.randint(1, 10, 8)
}
df = pd.DataFrame(dict_data)

# 分组求和并添加前缀
k1_sum = df.groupby('key1').sum().add_prefix('sum_')
print(k1_sum)

# 将聚合结果与原始数据合并
# 注意:left_on 指定原始数据的键,right_index 指定聚合结果的索引
result_merged = pd.merge(df, k1_sum, left_on='key1', right_index=True)
print(result_merged)

transform 函数的对齐特性

transform() 与 agg() 不同,它返回的结果索引与原始数据完全一致。这使得聚合结果可以直接作为新列添加到原始 DataFrame 中,无需额外的合并操作。

# 使用 transform 计算总和,结果按原始顺序排列
k1_sum_tf = df.groupby('key1').transform(np.sum).add_prefix('sum_')

# 将 transform 结果直接赋值给原始 DataFrame 的新列
df[k1_sum_tf.columns] = k1_sum_tf
print(df)

通过上述示例,可以看出 transform 在需要将聚合统计值“广播”回原始数据行时的便利性。以上就是Pandas聚合与分组运算的详细内容,更多关于Python数据处理与数据分析的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。