Создание кадра данных из имени файла, идентификатора контига и длины последовательности - PullRequest
2 голосов
/ 06 апреля 2019

Я пытаюсь создать фрейм данных из файлов фаста, которые содержат заголовок (имя контига) и последовательность ДНК.В первом столбце моего фрейма данных я хотел бы иметь имя файла, во второй строке я хотел бы иметь имя contig, а в третьем столбце я хотел бы иметь длину последовательности contig (числобазовые пары - мне не нужно это считать - это также в идентификаторе контига, чтобы я мог разделить его позже).

В блокноте jupyter (встроенном в оболочку bash) я попробовал следующее:

files = []
identifiers = []
# r=root, d=directories, f = files
for r, d, f in os.walk(path):
    for file in f:
        if '.fasta' in file:
            files.append(os.path.join(file)) #this grabs my file names and appends them to files - works
            open(file, "r")
            for line in file:
                identifiers.append(line) # this would grab the identifier - found on the first line of the file

Я ожидал бы, что это заполнит файлы = [] с именем файла1, именем файла2, именем файла3 и идентификаторами = [] с> contig_id_1_length = 309,> contig_id_2_length = 400,> contig_id_3_length = 40009 и т. Д. Затем я мог бы разделитьидентификаторы contigid с split () для получения длины contigs и добавления всех 3 рядов к фрейму данных pd.

1 Ответ

1 голос
/ 06 апреля 2019

Итак, я сгенерировал несколько фиктивных данных:

f1.fasta

>ctg_1_length=147
TCGTGGTCACCGATCGAAGATCCAATATCCGGAGATCGTCTACCTGTATGTAGTAAGCGCAAGGCCCGTTTACTGCGTCACCCTAGCAGAACGCCGACCAGGTCTCCTATAGTCACCGGCCTCGCACCTTTAAGTATGTATAGACGG
>ctg_2_length=141
GCTTGGGTGGGAACGGCTCGTGGCGGAGTACCCGAGAGTGGTTTCGGTATCTGGTGTCGTGCCAGGTTTAATTGAAAATTCAAGATTTTAAGTATCGCTTCAGATAGATTACTTACTGCGAGTGCCTTGTCACAGGGCGGG
>ctg_3_length=124
CCTTCGACCATGGATATCCTAACTCAGCCCCAGCCAGCTAACTCTGGACCAACCGAGAGCGTCTTTCTTTGATGTAACTAAGCTGGCGTTGGGCCCCCCGGTGTTCTAACGTATCTGAAGCCAA
>ctg_4_length=124
CGCGAACTTATCTTGTTATCGAAGATAGCTGTAGGAACTCGGCCAGCCCGACTATTTCGTTCGCCGCTTTCCCCTGGCTCTAGATGCAGTCCACAGATTCTTCTCAGGTGATGCGAGGAACAGG
>ctg_5_length=137
CCAACCCCTGCTCTAGGCTTACCGCCAAGCTACTCAATGGTTCGGTCGATGCAGAACGTATTACTATGTTCTCGACTCTCTGAAACCGCTGTCTACGAGGCAAGCCCCAAAATAGATGGAGGGGCCTCGCCTGTGGG

f2.fasta

>ctg_1_length=106
TCGATATTGGTTAAGGCGCGCAGCAATTTGGGAGTTGACGCACAACGTTCGGATGCGAGAGTGAGCATACGGTAGAGCCGAACCCACAATGGGTAACCGAACGACA
>ctg_2_length=60
CTACGATCTGAAATCCACTTCACGTGATCCGCGAGATGGGTTATTCGGTTTTTAGAACAT
>ctg_3_length=145
ACACTTATATCCACGATTGAGTGGCTCATCGGTGTGACACTCTGACGTCGTTTGAATACCTGCCCGGACAGGGTTTTCGTCAAACTCCCCGCGACGGTTCGTAACTGTCTGTACCCGTCGGCTGGACGAAGTTTAGATATAAAAC
>ctg_4_length=88
GAGCCGCTACATTACTTAATAACTTACAAAGGGCGAAGTCACATATTTCGTAAGAAGCATTCCTCGTCAGAATCCATTCCAAACCCCA
>ctg_5_length=87
CTACGCTAAGCTGCGGTACGACGGGGATATTACACGTACTAATCCATACCAACTAAATGGCATGTTGTTGAAGATAGCACTTTGAGG

Следующий код является "чистым" питономподход, он не требует никаких других модулей (кроме панд, для DataFrame):

import pandas as pd
from pathlib import Path

files = [x for x in Path().iterdir() if x.suffix == ".fasta"]
# [PosixPath('f1.fasta'), PosixPath('f2.fasta')]
read_list = []
for file in files:
    with file.open("r") as handle:
        for line in handle:
            if line.startswith(">"):
                line = line.strip()
                read_list.append((file.name,  # Change to file.resolve() for the absolute path
                                  *line[1:].split("=")
                                ))

df = pd.DataFrame(read_list, columns=["file", "ctg", "len"])

#        file           ctg  len
# 0  f1.fasta  ctg_1_length  147
# 1  f1.fasta  ctg_2_length  141
# 2  f1.fasta  ctg_3_length  124
# 3  f1.fasta  ctg_4_length  124
# 4  f1.fasta  ctg_5_length  137
# 5  f2.fasta  ctg_1_length  106
# 6  f2.fasta  ctg_2_length   60
# 7  f2.fasta  ctg_3_length  145
# 8  f2.fasta  ctg_4_length   88
# 9  f2.fasta  ctg_5_length   87

В качестве альтернативы, вы можете использовать SeqIO из biopython:

import pandas as pd
from pathlib import Path
from Bio import SeqIO 

files = [x for x in Path().iterdir() if x.suffix == ".fasta"]
read_list = []
for file in files:
    with file.open("r") as handle:
        for record in SeqIO.parse(handle, "fasta"):
            read_list.append((file.name, record.id, len(record.seq)))

df = pd.DataFrame(read_list, columns=["file", "ctg", "len"])

#        file               ctg  len
# 0  f1.fasta  ctg_1_length=147  147
# 1  f1.fasta  ctg_2_length=141  141
# 2  f1.fasta  ctg_3_length=124  124
# 3  f1.fasta  ctg_4_length=124  124
# 4  f1.fasta  ctg_5_length=137  137
# 5  f2.fasta  ctg_1_length=106  106
# 6  f2.fasta  ctg_2_length=60    60
# 7  f2.fasta  ctg_3_length=145  145
# 8  f2.fasta  ctg_4_length=88    88
# 9  f2.fasta  ctg_5_length=87    87

Оба они работают по одному и тому же принципу построения list (read_list) tuples.Поскольку каждый кортеж действует как запись, pandas может очень легко превратить их в DataFrame.

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