You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas groupby运算随数据量增大耗时剧增,如何向量化优化?

问题原因与优化方案

问题所在

你的代码中自定义了q75函数并在groupby.agg中调用,这是大数据量下耗时激增的核心原因:

  • pandas内置聚合函数(如mean、max)基于Cython实现向量化操作,执行效率极高;
  • 自定义Python函数(如q75)在聚合时会逐组调用Python解释器,每组都要启动一次函数调用,当分组数量或每组数据量增大时,这种循环调用的开销会被急剧放大,整体性能直线下降。

向量化优化方案

方案1:替换自定义函数为内置聚合写法

直接在agg中调用quantile,避免自定义函数的额外开销:

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)

# 直接在agg中使用内置quantile,无需自定义函数
df_result = df.groupby(['specimen', 'delta_t']).agg(
    measuremnt_mean=('measuremnt', 'mean'),
    measuremnt_q75=('measuremnt', lambda x: x.quantile(0.75)),
    measuremnt_max=('measuremnt', 'max'),
    lag_mean=('lag', 'mean')
).reset_index()

这种写法会让quantile调用复用pandas的向量化底层实现,比自定义函数效率提升显著。

方案2:拆分聚合操作后合并(极致性能优化)

将每个聚合操作单独执行(均为向量化),再通过pd.concat合并结果,完全规避自定义函数的Python循环开销:

# 分别执行所有向量化聚合操作
group_keys = ['specimen', 'delta_t']
agg_results = [
    df.groupby(group_keys)['measuremnt'].mean().rename('measuremnt_mean'),
    df.groupby(group_keys)['measuremnt'].quantile(0.75).rename('measuremnt_q75'),
    df.groupby(group_keys)['measuremnt'].max().rename('measuremnt_max'),
    df.groupby(group_keys)['lag'].mean().rename('lag_mean')
]

# 合并结果
df_result = pd.concat(agg_results, axis=1).reset_index()

这种方式在超大数据量下性能提升最明显,每个聚合都是独立的向量化运算。

额外优化点

  • 修正拼写错误:measuremnt应为measurement,避免后续维护混淆;
  • 若delta_t取值范围固定,可转为category类型,减少groupby分组计算开销:
    df['delta_t'] = df['delta_t'].astype('category')
    

内容的提问来源于stack exchange,提问作者r ram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 06:17:13