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

Pandas按Original_UserId分组的映射逻辑性能优化问询

优化分组后累计最大值计算的性能思路

问题场景

现有如下DataFrame:

import pandas as pd

test_df = pd.DataFrame({'Category': {0: 'product-availability address-confirmation input',
  1: 'registration register-data-confirmation options',
  2: 'onboarding return-start input',
  3: 'registration register-data-confirmation input',
  4: 'decision-tree first-interaction-validation options'},
 'Original_UserId': {0: '5511949551865@wa.gw.msging.net',
  1: '5511949551865@wa.gw.msging.net',
  2: '5511949551865@wa.gw.msging.net',
  3: '5511949551865@wa.gw.msging.net',
  4: '5511949551865@wa.gw.msging.net'}})

当前使用以下代码实现分组后标记首次出现目标值后的所有行:

test_df.groupby('Original_UserId',observed=True)['Category'].apply(lambda s : s.eq('onboarding return-start input').cummax())

该代码返回结果:

pd.Series({0: False, 1: False, 2: True, 3: True, 4: True})

但在大型数据集上运行耗时较长,以下是具体优化思路:


优化思路

  • 替换apply为groupby.transform
    apply会逐组执行Python lambda,效率较低。改用transform直接对组内执行向量化的cummax操作,底层为C实现,性能提升显著:

    mask = test_df['Category'] == 'onboarding return-start input'
    test_df['flag'] = mask.groupby(test_df['Original_UserId'], observed=True).cummax()
    
  • 提前预处理匹配掩码
    先计算好目标匹配的布尔掩码,再传入分组操作,避免在groupby的lambda中重复执行eq判断,减少计算开销。

  • 优化分组键的数据类型
    若Original_UserId是重复率较高的字符串,将其转换为category类型,可大幅提升分组效率:

    test_df['Original_UserId'] = test_df['Original_UserId'].astype('category')
    
  • 并行化处理超大规模数据集
    若数据集超出内存承载能力,可使用Dask实现并行计算,或用Swifter自动选择最优执行策略(向量化/并行):

    import swifter
    test_df['flag'] = mask.swifter.groupby(test_df['Original_UserId'], observed=True).cummax()
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:55:26