我有以下Python数据:
list1=[[ENS_ID1,ENS_ID2,ENS_ID3], [ENS_ID10,ENS_ID24,ENS_ID30] , ....]
映射(第一列是Ensemble基因ID,第二列是相应的MGI基因ID的数据框)
最好的解决方案是创建一个只包含查找值的快速数据结构,我的意思是键/值,字典可以非常快。之后,您必须遍历输入并创建查找版本。
import pandas as pd
list1=[['ENS_ID1','ENS_ID2','ENS_ID3'], ['ENS_ID10','ENS_ID3','ENS_ID2'] ]
mapping = pd.DataFrame({'ENS_ID':['ENS_ID1','ENS_ID2','ENS_ID3','ENS_ID10'], 'MGI_ID':['MGI_ID1','MGI_ID2','MGI_ID2','MGI_ID10']})
lookup = dict(mapping[['ENS_ID','MGI_ID']].values)
# This is superfast
mapped_list = []
for l in list1:
mapped_list.append([lookup[v] for v in l])
print(mapped_list)
# [['MGI_ID1', 'MGI_ID2', 'MGI_ID2'], ['MGI_ID10', 'MGI_ID2', 'MGI_ID2']]
ps: please correct the question with working code.
作为一个快速的解决方案,您可以尝试使用listcomp而不是append,这应该更快:
mgi_lists = [[mapping['MGI_ID'][mapping[mapping['ENSEMBL_ID']==i].index].values[0] for i in l] for l in ens_lists]
关于为什么listcomp更快的一些解释在这里