加快Pandas数据帧的搜索速度

2024-06-16 14:25:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个名为real_info的数据帧,它有3列,例如:

  Source   Target Interaction
0  MAP7D1    APOA1    physical
1  MAP7D1    RBM48    physical
2  MAP7D1  GPRASP1    physical
3  MAP7D1    COPS6    physical
4   USP20   MAP7D1    physical

我将这些列编入一个新的数据框,认为搜索会很快:

^{pr2}$

我有5000个字符串的名称列表,我在new_df中搜索这对字符串。如果存在匹配项,则我将存储在一个文件中,例如:

for names_A in name_list:
    for names_B in name_list:
        res = df.query('Source == "{}" & Target == "{}"'.format(names_A,names_B))
        if len(res.index.tolist()) > 0:
            res.to_csv('nets.csv', mode='a', header=False)

这个过程是可行的,但是在5000 X 5000列表中搜索对是非常缓慢的。有什么改进的建议吗?在


Tags: csv数据字符串nameinsourcetargetdf
2条回答

IIUC:(非常感谢@cᴏʟᴅsᴘᴇᴇᴅ和@Bharath指出了错误!)在

res = df.loc[df['Source'].isin(name_list) & df['Target'].isin(name_list)]
res.to_csv(...)

演示:

^{pr2}$

你已经成功了一半。非常感谢马旭,从他的文章中借用数据。在


第1步
索引是一个不错的选择,但我们只需索引前两列:

df = df.set_index(['Source', 'Target'])
df

              Interaction
Source Target            
a      z         physical
b      c         physical
c      x         physical
d      y         physical
e      b         physical
b      a         physical

第2步
生成所有可能的组合:

^{pr2}$

第3步
索引到数据帧,然后保存:

df = df.loc[df.index.intersection(c)].reset_index()
df

  Source Target Interaction
0      b      a    physical
1      b      c    physical

df.to_csv('nets.csv')

如果您有两个或多个name_lists来查找组合,而不是从一个name_list中获取元素,则可以选择此选项,在这种情况下,您将选择MaxU的答案。在

相关问题 更多 >