Biopython SeqIO至熊猫数据帧

Biopython SeqIO至熊猫数据帧,python,pandas,biopython,fasta,Python,Pandas,Biopython,Fasta,我有一个FASTA文件,可以很容易地解析 我对提取序列ID和序列长度感兴趣。我用这些行来做,但我觉得太重了(两次迭代、转换等) 我只需要一次迭代就可以完成,但我得到了一个命令: records = SeqIO.parse(fastaFile, 'fasta') 我不知何故无法获得数据帧。从dict开始工作 我的目标是迭代FASTA文件,并通过每次迭代将id和序列长度放入DataFrame 这是一个给那些想要帮助的人的建议。你很在行-你绝对不应该对文件进行两次解析,而且当你稍后将其转换为nump

我有一个FASTA文件,可以很容易地解析

我对提取序列ID和序列长度感兴趣。我用这些行来做,但我觉得太重了(两次迭代、转换等)

我只需要一次迭代就可以完成,但我得到了一个命令:

records = SeqIO.parse(fastaFile, 'fasta')
我不知何故无法获得数据帧。从dict开始工作

我的目标是迭代FASTA文件,并通过每次迭代将id和序列长度放入
DataFrame


这是一个给那些想要帮助的人的建议。

你很在行-你绝对不应该对文件进行两次解析,而且当你稍后将其转换为
numpy
数组时,将数据存储在字典中是对计算资源的浪费

SeqIO.parse()
返回一个生成器,因此您可以逐个记录迭代记录,构建如下列表:

with open('sequences.fasta') as fasta_file:  # Will close handle cleanly
    identifiers = []
    lengths = []
    for seq_record in SeqIO.parse(fasta_file, 'fasta'):  # (generator)
        identifiers.append(seq_record.id)
        lengths.append(len(seq_record.seq))
有关仅解析FASTA文件中的ID和序列的更有效方法,请参阅

你剩下的代码在我看来相当不错。但是,如果您确实想优化熊猫的使用,您可以阅读以下内容:


关于最小化内存使用 查阅,我们可以看到,
数据
作为
numpy
ndarray
进行内部存储:

class Series(np.ndarray, Picklable, Groupable):
    """Generic indexed series (time series or otherwise) object.

    Parameters
    ----------
    data:  array-like
        Underlying values of Series, preferably as numpy ndarray
如果将
标识符
设置为
ndarray
,则可以直接在
系列
中使用,而无需构建新数组(参数
copy
,默认值
False
)将阻止在不需要时创建新的
ndarray
。通过将序列存储在列表中,您将强制Series将所述列表强制为
ndarray

避免初始化列表 如果您事先确切知道有多少个序列(以及最长ID的长度),您可以初始化一个空的
ndarray
来保存标识符,如下所示:

num_seqs = 50
max_id_len = 60
numpy.empty((num_seqs, 1), dtype='S{:d}'.format(max_id_len))

当然,很难确切知道您将拥有多少个序列,或者最大的ID是什么,因此最简单的方法是让
numpy
从现有列表转换。但是,从技术上讲,这是存储数据以供
pandas

使用的最快方法,David在
pandas
方面给了您一个很好的答案,在Biopython端,如果只需要记录标识符及其序列长度,则不需要通过
Bio.SeqIO
使用
SeqRecord
对象-这应该更快:

from Bio.SeqIO.FastaIO import SimpleFastaParser
with open('sequences.fasta') as fasta_file:  # Will close handle cleanly
    identifiers = []
    lengths = []
    for title, sequence in SimpleFastaParser(fasta_file):
        identifiers.append(title.split(None, 1)[0])  # First word is ID
        lengths.append(len(sequence))

谢谢大卫,它成功了。也谢谢你的“记忆”评论!
from Bio.SeqIO.FastaIO import SimpleFastaParser
with open('sequences.fasta') as fasta_file:  # Will close handle cleanly
    identifiers = []
    lengths = []
    for title, sequence in SimpleFastaParser(fasta_file):
        identifiers.append(title.split(None, 1)[0])  # First word is ID
        lengths.append(len(sequence))