Pandas如何高效实现类Vlookup 按匹配值聚合列到列表
性能瓶颈原因
当前逐行apply+全表布尔筛选的实现时间复杂度为O(N*M)(N为原表总行数,M为Series2列的唯一值数量),每处理一个Series2取值都要扫描全部90万行数据,效率极低,长时间运行无结果是正常表现。
最优实现
使用pandas原生groupby聚合完成计算,该逻辑由底层优化的Cython实现,仅需单次遍历原表即可完成分组统计和值聚合,时间复杂度为O(N),90万行规模的数据可在数秒内完成计算。
直接生成完整结果(推荐)
无需分步计算值计数,一次聚合直接得到包含Series2、counts、Series1_List三列的目标结果:
df2 = df.groupby('Series2', as_index=False).agg( counts=('Series1', 'count'), Series1_List=('Series1', list) )
适配已有df2的快速匹配
如果已经提前生成了带counts列的df2,可先构建分组映射字典再做匹配,避免逐行扫描原表:
# 预构建Series2取值到对应Series1列表的映射 series2_map = df.groupby('Series2')['Series1'].apply(list).to_dict() # 批量映射赋值 df2['Series1_List'] = df2['Series2'].map(series2_map)
额外优化建议
如果后续需要对Series1_List中的值做数值运算,聚合时不要存储Python原生列表,替换为numpy数组可大幅降低内存占用、提升运算效率,只需将聚合参数中的list替换为lambda x: x.to_numpy()即可。
内容的提问来源于stack exchange,提问作者LugalG
相关产品推荐
相关产品推荐

