从blast结果中取出每个query搜到的evalue最小的结果

在做多基因blast时,通常每个基因找到的匹配序列很多。这时习惯根据evalue来进行筛选,evalue较小的其相似性更高。下面提供两种方法解决。

一 linux命令

第11列为evalue值,第一列为基因名,先根据evalue升序排列,然后根据基因名去重。默认会保留最上面的一条记录,即evalue最小值。

二 pandas

最近在看pandas,所以拿来练手。思路也是先排序,后去重。

import pandas as pd
#将blast(-outfmt 6)输出结果保存到DataFrame
inp = pd.read_table('E:\python_test\1.blast')
inp
query subject identity align_length mismatches gap_opens q_start q_end s_start s_end evalue bit_score
0 gene1 SQ183094348 100 147 0 0 1 147 378 232 3 272
1 gene1 SQ183119192 100 66 0 0 1 66 82 147 2 122
2 gene1 SQ182140986 100 157 0 0 1 157 88 244 1 291
3 gene2 SQ183094348 100 147 0 0 1 147 378 232 3 272
4 gene2 SQ183119192 100 66 0 0 1 66 82 147 2 122
5 gene2 SQ182140986 100 157 0 0 1 157 88 244 1 291
6 gene3 SQ183094348 100 147 0 0 1 147 378 232 9 272
7 gene3 SQ183119192 100 66 0 0 1 66 82 147 8 122
8 gene3 SQ182140986 100 157 0 0 1 157 88 244 7 291
#取出每个query对应的evalue最低的subject
inp.sort_values(by=['query','evalue']).drop_duplicates(subset='query')
query subject identity align_length mismatches gap_opens q_start q_end s_start s_end evalue bit_score
2 gene1 SQ182140986 100 157 0 0 1 157 88 244 1 291
5 gene2 SQ182140986 100 157 0 0 1 157 88 244 1 291
8 gene3 SQ182140986 100 157 0 0 1 157 88 244 7 291

有可能出现gene相同,evalue相同的情况,我觉得可以在加上bit_socre和align_length进行排序,这两列为降序排列。

猜你喜欢

转载自blog.csdn.net/weixin_40099163/article/details/83215747