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.transformapply会逐组执行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
相关产品推荐
相关产品推荐

