Pandas groupby apply执行速度过慢,如何优化现有分组聚合逻辑?
Pandas groupby apply 耗时过长优化方案
你的代码性能瓶颈来自自定义apply函数的额外开销:逐组调用Python层函数、反复生成pd.Series对象的成本远高于内置向量化操作,你当前的所有聚合逻辑都可以通过Pandas原生能力优化,性能通常可提升10~100倍。
核心优化方案:替换自定义apply为内置agg聚合+全局衍生计算
# 第一步:用agg批量完成组内聚合,所有运算在C层执行无额外开销 agg_result = xactions.groupby('user_wid').agg( user_name=('user_name', 'max'), user_age=('user_age', 'max'), user_gender=('user_gender', 'max'), last_visit_date=('sale_date', 'max'), days_since_first_visit=('days_since_first_visit', 'max'), num_visits_window=('visit', 'max'), num_visits_total=('num_user_visits', 'max'), products_used=('product', 'max'), user_total_sales=('sale_price', 'sum'), membership=('whether_member', 'max') ).reset_index() # 第二步:全局向量化计算衍生列,避免组内逐组计算开销 agg_result['user_total_sales'] = agg_result['user_total_sales'].round(2) agg_result['avg_spend_visit'] = (agg_result['user_total_sales'] / agg_result['num_visits_window']).round(2) users = agg_result
补充优化建议
- 提前转换数据类型:将
sale_date列转换为datetime类型,max聚合速度远高于字符串比较,对应代码为xactions['sale_date'] = pd.to_datetime(xactions['sale_date']) - 数值列压缩:对取值范围小的数值列(如
whether_member、visit)转换为更小的存储类型(如int8、int16),降低内存占用同时提升聚合速度 - 超大数据集场景:如果数据量超过千万行,可以改用Polars框架实现相同逻辑,并行聚合效率比Pandas高5~10倍
内容的提问来源于stack exchange,提问作者Chinmay Das
相关产品推荐
相关产品推荐

