讲师中心 微信公众号
AI工具推荐 视频效率加速

Pandas groupby 性能优化:实现高效数据聚合

冬墨同学_1404

冬墨同学_1404

发布时间:2025-11-23 13:49:16

|

779人浏览过

|

来源于php中文网

原创

Pandas groupby 性能优化:实现高效数据聚合

本文深入探讨了pandas `groupby`操作在处理大规模数据时可能出现的性能瓶颈,特别是当结合`agg`方法进行多重聚合或使用自定义函数时。文章提出并详细演示了一种“懒惰式groupby”的优化策略,通过预先创建`groupby`对象,然后对每个列单独执行聚合操作,显著提升了数据聚合的效率。文中提供了具体的代码示例和性能对比,并讨论了如何灵活控制输出列名结构,旨在帮助用户编写更高效的pandas代码。

理解 Pandas groupby 的性能挑战

Pandas groupby 是数据分析中一个极其强大的工具,用于根据一个或多个键对数据进行分组,然后对每个组执行聚合操作。然而,当数据集规模增大,并且聚合操作变得复杂时,其性能可能会显著下降。常见的慢速模式之一是结合 agg 方法进行多列、多类型或包含自定义函数的聚合。

考虑以下一个典型的使用场景,我们希望根据 specimen 和 delta_t 列对数据进行分组,并计算 measuremnt 列的均值、75%分位数和最大值,以及 lag 列的均值。

import pandas as pd
import numpy as np

# 模拟数据集
data = {
    'delta_t': np.random.randint(0, 301, 100000), # 增加数据量以凸显性能问题
    'specimen': np.random.choice(['X', 'Y', 'Z'], 100000),
    'measuremnt': np.random.rand(100000),
    'lag': np.random.rand(100000)
}
df = pd.DataFrame(data)

# 定义一个自定义的75%分位数函数
def q75(x):
    return x.quantile(0.75)

# 原始的聚合代码
# df_result = df.groupby(['specimen', 'delta_t']).agg({
#     'measuremnt': ['mean', q75, 'max'],
#     'lag': 'mean'
# }).reset_index()

当上述代码应用于大型DataFrame时,用户可能会观察到执行时间随数据量呈非线性增长,导致处理效率低下。这通常是由于 agg 方法在内部处理多重聚合和自定义函数时,可能需要进行多次数据迭代或不必要的类型转换。

优化策略:懒惰式 groupby (Lazy Groupby)

为了解决 groupby().agg() 可能带来的性能问题,我们可以采用一种“懒惰式 groupby”的优化策略。其核心思想是:首先创建 groupby 对象,然后对该对象中的每个需要聚合的列单独执行聚合函数,最后将这些结果组合成一个新的DataFrame。这种方法通常能够显著减少内部开销,因为它允许Pandas更直接地优化每个独立的聚合操作。

1. 性能对比与优化实现

让我们通过具体的代码示例来展示这种优化方法及其带来的性能提升。

原始 agg 方法的性能(示例,假设数据量增大):

# %%timeit -n 10
# df_result_original = df.groupby(['specimen', 'delta_t']).agg({
#     'measuremnt': ['mean', q75, 'max'],
#     'lag': 'mean'
# }).reset_index()
# 假设其执行时间为 40-50 毫秒 (针对10万行数据)

优化后的“懒惰式 groupby”实现:

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载
# %%timeit -n 10
groups = df.groupby(['specimen', 'delta_t'])

df_result_optimized = pd.DataFrame({
    'measurement_mean': groups['measuremnt'].mean(),
    'measurement_q75': groups['measuremnt'].quantile(.75),
    'measurement_max': groups['measuremnt'].max(),
    'lag_mean': groups['lag'].mean()
}).reset_index()

# 假设其执行时间为 2-3 毫秒 (针对10万行数据),性能提升显著
print(df_result_optimized.head())

输出示例:

  specimen  delta_t  measurement_mean  measurement_q75  measurement_max  lag_mean
0        X        0          0.490533         0.490533         0.490533  0.076840
1        X        1          0.472935         0.472935         0.472935  0.473552
2        X        2          0.449622         0.449622         0.449622  0.507664
3        X        3          0.469796         0.469796         0.469796  0.435753
4        X        4          0.509748         0.509748         0.509748  0.472064

从上述对比中可以看出,通过将聚合操作分解到各个列上执行,并直接构建新的DataFrame,我们能够实现数量级的性能提升。这种方法避免了 agg 在处理复杂聚合时可能产生的额外开销。

2. 处理多层索引输出 (MultiIndex)

原始的 agg 方法在聚合多列并使用多个聚合函数时,默认会生成一个多层列索引(MultiIndex)。如果你的应用场景需要这种结构,也可以通过“懒惰式 groupby”方法来实现。只需在构建DataFrame时,将列名定义为元组即可。

groups = df.groupby(['specimen', 'delta_t'])

df_result_multiindex = pd.DataFrame({
    ('measurement','mean'): groups['measuremnt'].mean(),
    ('measurement','q75'): groups['measuremnt'].quantile(.75),
    ('measurement','max'): groups['measuremnt'].max(),
    ('lag','mean'): groups['lag'].mean()
}).reset_index()

print(df_result_multiindex.head())

输出示例:

  specimen  delta_t measurement                      lag
                               mean       q75       max    mean
0        X        0     0.490533  0.490533  0.490533  0.076840
1        X        1     0.472935  0.472935  0.472935  0.473552
2        X        2     0.449622  0.449622  0.449622  0.507664
3        X        3     0.469796  0.469796  0.469796  0.435753
4        X        4     0.509748  0.509748  0.509748  0.472064

通过使用元组作为字典的键,Pandas在构建DataFrame时会自动识别并创建多层列索引,从而模拟 agg 的默认输出结构。

注意事项与最佳实践

  1. 选择合适的聚合方法:
    • 对于简单的单列或少量聚合,agg 方法通常足够方便且性能尚可。
    • 当聚合操作复杂(多列、多函数、自定义函数)且数据量较大时,优先考虑“懒惰式 groupby”策略。
    • 如果聚合函数是Pandas或NumPy的内置函数,它们通常是高度优化的。自定义Python函数(如本例中的 q75)可能会引入额外的性能开销,尤其是在 agg 内部。
  2. 避免不必要的 reset_index(): 如果不需要将分组键作为普通列,可以省略 reset_index(),直接使用 groupby 结果的索引作为DataFrame的索引,这可以节省一步操作。
  3. 数据类型优化: 确保DataFrame中的列使用最合适的数据类型。例如,整数列不应存储为浮点数,这可以减少内存占用并可能加速某些操作。
  4. 内存管理: 对于极大数据集,即使是优化后的 groupby 也可能消耗大量内存。考虑使用Dask等分布式计算库,或分块处理数据。
  5. 预计算: 如果某些中间结果可以预先计算或缓存,可以进一步提升整体性能。

总结

Pandas groupby 是数据处理的核心功能,但其性能并非一成不变。通过理解 agg 方法在复杂场景下可能带来的开销,并采纳“懒惰式 groupby”的优化策略,开发者可以显著提升大数据聚合的效率。这种方法不仅能够加速计算,还能提供更灵活的列名控制,从而更好地适应不同的数据分析需求。在实际项目中,根据具体的数据规模和聚合复杂度,选择最适合的 groupby 实现方式,是编写高效Pandas代码的关键。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
什么是分布式
什么是分布式

分布式是一种计算和数据处理的方式,将计算任务或数据分散到多个计算机或节点中进行处理。本专题为大家提供分布式相关的文章、下载、课程内容,供大家免费下载体验。

2133

2023.08.11

分布式和微服务的区别
分布式和微服务的区别

分布式和微服务的区别在定义和概念、设计思想、粒度和复杂性、服务边界和自治性、技术栈和部署方式等。本专题为大家提供分布式和微服务相关的文章、下载、课程内容,供大家免费下载体验。

3434

2023.10.07

Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

340

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

272

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

751

2026.04.13

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3251

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

554

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

542

2026.02.12

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn