如何加速Pandas中用于Ensemble ID转MGI ID的嵌套for循环?
优化思路
原代码运行速度极慢的核心原因是:每次内层循环都对整个DataFrame执行全表布尔匹配,单条ID查找的时间复杂度为O(n),总时间复杂度随数据规模上升呈指数级增长。
最优优化方案
将ID映射关系提前转为Python字典,利用字典O(1)的查找特性大幅降低查找开销,再通过列表推导完成嵌套列表的转换,整体效率可提升数十到数千倍。
实现代码
# 第一步:将DataFrame转为 ENS_ID -> MGI_ID 的映射字典 # 若你的Ensemble ID列实际名为ENSEMBL_ID,替换set_index的入参即可 id_map = mapping.set_index('ENS_ID')['MGI_ID'].to_dict() # 第二步:转换嵌套列表,比双层for循环+append写法效率更高 mgi_lists = [[id_map[ens_id] for ens_id in sub_list] for sub_list in list1]
可选兼容处理(适配未匹配ID场景)
如果存在部分ENS_ID没有对应MGI_ID的情况,可改用get方法避免抛出KeyError,自定义缺失值的返回内容:
# 未匹配到的ID统一填充为None,也可替换为你需要的默认值比如'无对应ID' mgi_lists = [[id_map.get(ens_id, None) for ens_id in sub_list] for sub_list in list1]
效率对比
假设list1总共有10万个ENS_ID,mapping有5万条映射关系:
- 原代码耗时约几分钟到几十分钟不等,随数据规模增长快速上升
- 字典+列表推导的方案耗时仅需几十毫秒到几百毫秒
内容的提问来源于stack exchange,提问作者Andrea
相关产品推荐
相关产品推荐

