如何将FASTA文件正确转换为pandas DataFrame?
问题原因
Biopython解析FASTA得到的seqFP.seq是专属Seq类型,属于可迭代对象,直接传入pandas构造Series/DataFrame时,pandas会自动遍历可迭代对象,把每个氨基酸/碱基拆成单独元素,就会出现单字符拆分的异常显示。另外原代码中正则匹配返回的是match对象,不是实际匹配到的注释文本,直接存储无法得到正确的注释内容。
修正后可直接运行的代码
import pandas as pd import re from Bio import SeqIO data = [] # 替换为你的FASTA文件实际路径 fasta_path = '/Users/xxx.fasta' with open(fasta_path, 'r', encoding='utf-8') as f: for record in SeqIO.parse(f, "fasta"): # Seq对象转原生字符串,从根源避免pandas按字符拆分 seq = str(record.seq) # 提取[]包裹的注释,兼容无匹配的异常情况 annotate_res = re.search(r"\[([^]]*)\]", record.description) annotate = annotate_res.group(1) if annotate_res else "" data.append({ "seq_id": record.id, "taxon_annotate": annotate, "full_sequence": seq }) # 构造DataFrame df = pd.DataFrame(data) # 预览前5行确认格式正确 print(df.head()) # 导出为xls文件,index=False去掉导出行号 df.to_excel('/Users/xxx_fasta_convert_result.xls', index=False)
补充说明
- 若导出Excel时报依赖缺失:生成
.xlsx格式文件执行pip install openpyxl安装依赖;生成老版.xls格式执行pip install xlwt安装依赖即可。 - 如果FASTA头里有多个
[]包裹的注释字段,可以把re.search换成re.findall,按需求拆分多列存储,更方便后续按不同分类维度给系统发育树着色。 - 导出的表格默认包含序列ID、提取的物种/分类注释、完整序列三列,可直接对接常用的系统发育树注释工具使用。
内容的提问来源于stack exchange,提问作者Alvin Liu
相关产品推荐
相关产品推荐

