根据 python 中的数据框重命名 fasta 文件
Rename fasta file according to a dataframe in python
您好,我有一个很大的文件,例如:
>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
想法是根据tab
重命名>Seqname
。
然后对于每个 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','Seq2.2','Seq3.1_0','Seq5.2_3','Seq3.1_1']})
与 Andrej 相同的词典:
mapper = tab.set_index('query').to_dict()['New_query']
然后类似于你所做的,我们只是改变header(通过更新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")
您好,我有一个很大的文件,例如:
>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
想法是根据tab
重命名>Seqname
。
然后对于每个 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','Seq2.2','Seq3.1_0','Seq5.2_3','Seq3.1_1']})
与 Andrej 相同的词典:
mapper = tab.set_index('query').to_dict()['New_query']
然后类似于你所做的,我们只是改变header(通过更新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")