【问题标题】:Any faster way to search each value of one column through another column in python?在python中通过另一列搜索一列的每个值的任何更快的方法?
【发布时间】:2021-07-25 18:04:46
【问题描述】:

我需要搜索一列的每个值,与另一列的所有条目进行比较,如果满足某些条件,则打印。我正在使用下面的python代码,它可以工作,但缺点是两列都有数万个条目,所以速度很慢。有没有更有效的方法来做到这一点?

for i in df1.index:
    for j in df2['pdb']:
        if df1['pdb'][i] == df2['pdb'][j]:
            if df1['res1'][i] >= df2['start'][j] and df1['res2'][i] <= df2['end'][j]: 
                print(df1['pdb'][i], df2['PFAM_ACC'][j])

例子:

df1 = 
pdb    res1   res2
4xhfA   76    83
4xhfA   126   133
2mx1A   179   186
3s8lA   111   118
4ucmA   115   122
1pigA   119   126
4mavA   263   270
4mavA   289   296
3sbrA   101   108
3sbrA   148   155
3sbrA   158   165
3sbrA   222   229
3sbrA   394   401
5zeaA   83    90
5zeaC   562   569
5zeaD   32    39
5zeaD   89    96
5zeaG   277   284

df2 =
 pdb    start  end  PFAM_ACC
 4xhfA  140    236  PF04205
 1pigA  61     332  PF00128
 1pigA  409    493  PF02806
 3sbrA  171    241  PF18793
 3sbrA  424    494  PF18764
 3sbrA  558    635  PF00116
 5zeaA  13     75   PF02874
 5zeaC  13     75   PF02874
 5zeaD  15     81   PF02874
 5zeaG  13     75   PF02874

我想得到输出:

 1pigA     PF00128
 3sbrA     PF18793
 5zeaD     PF02874

我希望现在更清楚了。

如果您有任何建议,请告诉我

【问题讨论】:

  • 您能否编辑您的问题并将示例(小)输入和预期输出(以文本形式 - 以便我们复制和粘贴)放在那里?
  • 谢谢 Andrej,我已经编辑过了。我希望现在很清楚。

标签: python dataframe loops search iteration


【解决方案1】:

试试:

x = df1.merge(df2, on="pdb")
out = x.loc[
    (x["res1"] >= x["start"]) & (x["res2"] <= x["end"]), ["pdb", "PFAM_ACC"]
]
print(out)

打印:

      pdb PFAM_ACC
2   1pigA  PF00128
13  3sbrA  PF18793
21  5zeaD  PF02874

【讨论】:

  • 太棒了!快得多。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多