изменить имя seq в файле fasta с фреймом данных - PullRequest
0 голосов
/ 04 мая 2018

У меня проблема, я объясняю суть.

У меня есть один файл fasta такой:

>seqA
AAAAATTTGG
>seqB
ATTGGGCCG
>seqC
ATTGGCC
>seqD
ATTGGACAG

и датафрейм:

seq name      New name seq
seqB            BOBO
seqC            JOHN

и я просто хочу изменить имя моего seq идентификатора в файле fasta, если в моем фрейме данных есть такое же имя seq, и изменить его на новое имя seq, это даст:

Новый фильм:

>seqA
AAAAATTTGG
>BOBO
ATTGGGCCG
>JOHN
ATTGGCC
>seqD
ATTGGACAG

Большое спасибо

редактировать: Я использовал этот скрипт:

blast=pd.read_table("matches_Busco_0035_0042.m8",header=None)
blast.columns = ["qseqid", "Busco_ID", "pident", "length", "mismatch", "gapopen","qstart", "qend", "sstart", "send", "evalue", "bitscore"]

repl = blast[blast.pident > 95]

print(repl)

#substituion dataframe

newfile = []
count = 0

for rec in SeqIO.parse("concatenate_0035_0042_aa2.fa", "fasta"):
    #get corresponding value for record ID from dataframe
    x = repl.loc[repl.seq == rec.id, "Busco_ID"]
    #change record, if not empty
    if x.any():
        rec.name = rec.description = rec.id = x.iloc[0]
        count += 1
    #append record to list
    newfile.append(rec)

#write list into new fasta file
SeqIO.write(newfile, "changedtest.faa", "fasta")
#tell us, how hard you had to work for us
print("I changed {} entries!".format(count))

И я получил следующую ошибку:

Traceback (most recent call last):
  File "Get_busco_blast.py", line 74, in <module>
    x = repl.loc[repl.seq == rec.id, "Busco_ID"]
  File "/usr/local/lib/python3.6/site-packages/pandas/core/generic.py", line 3614, in __getattr__
    return object.__getattribute__(self, name)
AttributeError: 'DataFrame' object has no attribute 'seq'

Ответы [ 2 ]

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

Это проще сделать с чем-то вроде BioPython .

Сначала создайте словарь

names = Series(df['seq name'].values,index=df['New seq name']).to_dict()

Теперь повторяем

from Bio import SeqIO
outs = []
for record in SeqIO.parse("orig.fasta", "fasta"):
    record.id = names.get(record.id, default=record.id)
    outs.append(record)
SeqIO.write(open("new.fasta", "w"), outs, "fasta")
0 голосов
/ 04 мая 2018

Если у вас установлено Biopython, вы можете использовать SeqIO для чтения / записи файлов fasta:

from Bio import SeqIO

#substituion dataframe
repl = pd.DataFrame(np.asarray([["seqB_3652_i36", "Bob"], ["seqC_123_6XXX1", "Patrick"]]), columns = ["seq", "newseq"])

newfile = []
count = 0

for rec in SeqIO.parse("test.faa", "fasta"):
    #get corresponding value for record ID from dataframe
    #repl["seq"] and "newseq" are the pandas column with the old and new sequence names, respectively
    x = repl.loc[repl["seq"] == rec.id, "newseq"]
    #change record, if not empty
    if x.any():
        #append old identifier number to the new id name
        rec.name = rec.description = rec.id = x.iloc[0] + rec.id[rec.id.index("_"):]
        count += 1
    #append record to list
    newfile.append(rec)

#write list into new fasta file
SeqIO.write(newfile, "changedtest.faa", "fasta")
#tell us, how hard you had to work for us
print("I changed {} entries!".format(count))

Обратите внимание, что этот скрипт не проверяет наличие нескольких записей в таблице подстановок. Он просто берет первый элемент или ничего не меняет, если идентификатор записи отсутствует в кадре данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...