Sar*_*ara 5 python fasta biopython pandas
我有一个FASTA文件,可以很容易地对其进行解析SeqIO.parse。
我对提取序列ID和序列长度感兴趣。我用这些行来做,但是我觉得它太重了(两次迭代,转换等)。
from Bio import SeqIO
import pandas as pd
# parse sequence fasta file
identifiers = [seq_record.id for seq_record in SeqIO.parse("sequence.fasta",
"fasta")]
lengths = [len(seq_record.seq) for seq_record in SeqIO.parse("sequence.fasta",
"fasta")]
#converting lists to pandas Series
s1 = Series(identifiers, name='ID')
s2 = Series(lengths, name='length')
#Gathering Series into a pandas DataFrame and rename index as ID column
Qfasta = DataFrame(dict(ID=s1, length=s2)).set_index(['ID'])
Run Code Online (Sandbox Code Playgroud)
我只需要一个迭代就可以做到,但是我得到了一个字典:
records = SeqIO.parse(fastaFile, 'fasta')
Run Code Online (Sandbox Code Playgroud)
我不知怎么DataFrame.from_dict去上班...
我的目标是迭代FASTA文件,并DataFrame在每次迭代中获取ID和序列长度。
这是一份简短的FASTA文件,供那些需要帮助的人使用。
您已经发现了-绝对不应该对文件进行两次解析,而将数据存储在字典中会浪费计算资源,而稍后您只是将其转换为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))
Run Code Online (Sandbox Code Playgroud)
请参阅Peter Cock的答案,以更有效的方式仅解析FASTA文件中的ID和序列。
您的其余代码对我来说看起来不错。但是,如果您确实想针对与结合使用进行优化pandas,则可以阅读以下内容:
查阅的来源panda.Series,我们可以看到它data作为一个内部存储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
Run Code Online (Sandbox Code Playgroud)
如果你做identifiers的ndarray,它可以直接在使用Series无需构建新的阵列(参数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))
Run Code Online (Sandbox Code Playgroud)
当然,很难确切地知道您将拥有多少个序列,或者最大的ID是多少,因此,最简单的方法就是numpy从现有列表中进行转换。但是,从技术上讲,这是存储数据以供在中使用的最快方法pandas。
David 给了你一个很好的答案pandas,在 Biopython 方面SeqRecord,Bio.SeqIO如果你想要的只是记录标识符和它们的序列长度,你不需要使用对象- 这应该更快:
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))
Run Code Online (Sandbox Code Playgroud)