【问题标题】:Rename fasta file according to a dataframe in python根据python中的数据框重命名fasta文件
【发布时间】:2020-10-31 19:40:58
【问题描述】:

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

>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

它有效,但需要很多时间......

【问题讨论】:

    标签: python pandas biopython


    【解决方案1】:

    您可以从数据帧创建映射器字典,然后逐行读取 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
    

    【讨论】:

      【解决方案2】:

      @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']
      

      然后与您所做的类似,我们只是更改标题(通过更新 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")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-05
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-23
        • 1970-01-01
        相关资源
        最近更新 更多