微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

根据python中的数据框重命名fasta文件

如何解决根据python中的数据框重命名fasta文件

您好,我有一个很大的文件,例如:

>Seq1.1
AAAGGAGAATAGA
>Seq2.2
AGGAGCTTCTCAC
>Seq3.1
CGTACTACGAGA
>Seq5.2
CGAGATATA
>Seq3.1
CGTACTACGAGA
>Seq2
AGGAGAT

一个数据框,例如:

标签

query  New_query
Seq1.1 Seq1.1
Seq2.2 Seq2.2
Seq3.1 Seq3.1_0
Seq5.2 Seq5.2_3
Seq3.1 Seq3.1_1

并且想法是根据>Seqname重命名tab

然后对于每个Seqname,如果tab['query']!= tab['New_query'],则将Seqname重命名tab['New_query']

Ps:选项卡中没有所有的> Seqname,如果是这种情况,那么我什么也不做。

然后我应该获得一个新的fasta文件,例如:

 >Seq1.1
    AAAGGAGAATAGA
    >Seq2.2
    AGGAGCTTCTCAC
    >Seq3.1_0
    CGTACTACGAGA
    >Seq5.2_3
    CGAGATATA
    >Seq3.1_1
    CGTACTACGAGA
    >Seq2
    AGGAGAT

我尝试了以下代码

records = SeqIO.parse("My_fasta_file.aa",'fasta')
for record in records:
    subtab=tab[tab['query']==record.id]
    subtab=subtab.drop_duplicates(subset ="New_query",keep = "first") 
    if subtab.empty == True: #it means that the seq was not in the tab,so I do not rename the sequence. 
        continue
    else:
        if subtab['query'].iloc[0] != subtab['New_query'].iloc[0]:
            record.id = subtab['New_query']
            record.description = subtab['New_query']
        else:
            continue

它可以工作,但是要花很多时间...

解决方法

您可以从数据框中创建一个映射器字典,然后逐行读取fasta文件,用以>开头的行代替:

mapper = tab.set_index('query').to_dict()['New_query']

with open('My_fasta_file.aa','r') as f_in,open('output.txt','w') as f_out:
    for line in map(str.strip,f_in):
        if line.startswith('>'):
            v = line.split('>')[-1]
            line = '>{}'.format(mapper.get(v,v))
        print(line,file=f_out)

创建output.txt

>Seq1.1
AAAGGAGAATAGA
>Seq2.2
AGGAGCTTCTCAC
>Seq3.1_1
CGTACTACGAGA
>Seq5.2_3
CGAGATATA
>Seq3.1_1
CGTACTACGAGA
>Seq2
AGGAGAT
,

@Andrej使用字典的解决方案确实是一种方法。由于您已经在使用biopython,下面是一种使用它的方法,我认为这可能很好,因为它可以正确处理fasta文件。

您的data.frame是:

tab = pd.DataFrame({'query':['Seq1.1','Seq2.2','Seq3.1','Seq5.2','Seq3.1'],'New_query':['Seq1.1','Seq3.1_0','Seq5.2_3','Seq3.1_1']})

与Andrej词典相同:

mapper = tab.set_index('query').to_dict()['New_query']

然后类似于您所做的,我们只是更改标题(通过更新ID和描述,感谢@Chris_Rands):

records = list(SeqIO.parse("My_fasta_file.aa","fasta"))
for i in records:
    i.id = mapper.get(i.id,i.id)
    i.description = mapper.get(i.description,i.description)

现在写入文件:

with open("new.fasta","w") as output_handle:
    SeqIO.write(records,output_handle,"fasta")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。