Переключение fasta seq в зависимости от кадра данных - PullRequest
0 голосов
/ 12 мая 2018

На самом деле у меня есть 2 файла fastta с именем:

result1_aa.fasta
result2_aa.fasta

В этих файлах мои последовательности такие:

файл result1_aa.fasta:

>gene1_B
ATTGGACCA
>gene2_A
ATTAGGAC
>gene90_B
ATTAGCCACA
>gene65_B
ATTGAG

файл result2_aa.fasta:

>gene78_A
ATTGGACCA
>gene45_B
ATTAGGAC
>gene93_B
ATTAGCCACA
>gene54_A
ATTGACA

и у меня есть датафрейм такой:

geneA      geneB
gene78_A   gene1_B
gene2_A    gene45_B
gene90_A   gene93_B
gene54_A   gene65_B

они на самом деле в порядке (см. _number) И я хотел бы получить 2 новых файла fasta с тем же порядком, что и на приведенном выше кадре данных, здесь это будет:

файл result1_aa_new.fasta:

>gene78_A
ATTGGACCA
>gene2_A
ATTAGGAC
>gene90_A
ATTAGCCACA
>gene54_A
ATTGACA

файл result2_new_aa.fasta:

>gene1_B
ATTGGACCA
>gene45_B
ATTAGGAC
>gene93_B
ATTAGCCACA
>gene65_B
ATTGAG

Я попробовал некоторые решения, но мне не удалось сохранить порядок в моем файле fasta в качестве фрейма данных ...

С решением Ами:

    from Bio import SeqIO
    import sys
    from Bio.SeqRecord import SeqRecord
    import pandas as pd

    seq_0042_aa=open("seq_0042_aa.fasta","w")
    seq_0042_dna=open("seq_0042_dna.fasta","w")
    seq_0035_aa=open("seq_0035_aa.fasta","w")
    seq_0035_dna=open("seq_0035_dna.fasta","w")

    dN_dS_sorted=pd.read_table("dn_ds.out_sorted",sep='\t')

    seq1_id=dN_dS_sorted["seq1_id"] #first row
    seq2_id=dN_dS_sorted["seq2_id"] #second row


    from Bio import SeqIO
    results1 = list(SeqIO.parse("result1_aa.fasta", "fasta"))
    results1 = pd.DataFrame({'f_id': [r.id for r in results1], 'f_seq': results1})

    results1 = pd.merge(dN_dS_sorted, results1, left_on="seq1_id", right_on='f_id', how='left').dropna()
    results1 = list(results1.f_seq.values)

    with open("out.fasta", "w") as output_handle:
        SeqIO.write(results1, output_handle, "fasta")

    results2 = list(SeqIO.parse("result2_aa.fasta", "fasta"))
    results2 = pd.DataFrame({'f_id': [r.id for r in results2], 'f_seq': results2})

    results2 = pd.merge(dN_dS_sorted, results2, left_on="seq2_id", right_on='f_id', how='left').dropna()
    results2 = list(results2.f_seq.values)

    with open("out2.fasta", "w") as output_handle:
        SeqIO.write(results2, output_handle, "fasta")

вот заголовок моего фрейма данных:

seq1_id             seq2_id              dN               dS
g66097.t1_0035_0035 g13600.t1_0042_0042 0.10455938989199982 0.3122332927029104
g45594.t1_0035_0035 g1464.t1_0042_0042  0.5208761055250978  5.430485421797574
g50055.t1_0035_0035 g34744.t1_0042_0035 0.08040473491714645 0.4233916132491867
g34020.t1_0035_0035 g12096.t1_0042_0042 0.4385191689737516  26.834927363887587
g28436.t1_0035_0042 g35222.t1_0042_0035 0.055299811368483165    0.1181241496387666

Тогда в выводе я должен получить:

output1:

>g66097.t1_0035_0035
ATTGGAGATA
>g45594.t1_0035_0035    
TAGGAGGAGA
>g34020.t1_0035_0035
ATGGGAT
>g28436.t1_0035_0042
ATTGGAGA

и вывод2:

>g13600.t1_0042_0042    
ATGGGAGAGA
>g1464.t1_0042_0042 
ATGGAGGAGA
>g12096.t1_0042_0042    
ATGGAGGAA
>g35222.t1_0042_0035
ATGGAGAG

но я на самом деле получаю: output1:

>g28436.t1_0035_0042
ATGAGAGAGA
>g1005.t1_0035_0035
ATAGGAGATA
>g28456.t1_0035_0035
ATGGAGATA
>g30148.t1_0035_0042
ATGGAGA

и output2:

>g35222.t1_0042_0035
ATAGGAGA
>g11524.t1_0042_0042
ATAGGAGA
>g31669.t1_0042_0035
ATGAGAGA
>g37790.t1_0042_0035
ATGAGGAGA

Вот глава fastafile1:

>g13600.t1_0042_0042
AGATAGAGA
>g1464.t1_0042_0042
AGATTAGA
>g34744.t1_0042_0035
ATAGAGGA
>g12096.t1_0042_0042
AGATATGA

вот глава fastafile2:

>g66097.t1_0035_0035
AGATTAGAGA
>g45594.t1_0035_0035
AGTATAGAGA
>g50055.t1_0035_0035
ATAGGAGAGA
>g34020.t1_0035_0035
ATAGGAGAG

1 Ответ

0 голосов
/ 12 мая 2018

Давайте сделаем первый файл. Снова используя BioPython ,

from Bio import SeqIO
results1 = list(SeqIO.parse("result1_aa.fasta", "fasta"))
results1 = pd.DataFrame({'f_id': [r.id for r in results1], 'f_seq': results1})

Теперь объедините их:

results1 = pd.merge(df, results1, left_on='results_on', right_on='id', how='left').dropna()

(предполагается, что имя столбца results_on - вы его не указали.

Теперь получите отсортированные записи:

results1 = list(results1.f_seq.values)

Запишите это:

with open("out.fasta", "w") as output_handle:
    SeqIO.write(results1, output_handle, "fasta")
...