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
相关产品推荐
相关产品推荐

