在做多基因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进行排序,这两列为降序排列。