如何将特定格式的FASTA文件转换为Pandas DataFrame?
将FASTA文件转换为指定格式的Pandas DataFrame
问题场景
现有如下格式的FASTA文件:
>abc 123 MMKFKPNQTRTYSRYPDQWIVPGGGME GAAVREVYEEAGVKGKLGRLLGIFEQN NMNJ >hik rre MMKFKPNPGDREGFKKRAACLCFRSEQ EDEVLLVSSQTRTYSRYPDQWIVPGGG MEPEEE >dmd kij MMKFKPNQTRTYSRYPDQWIVPGGGME >dmd 879 MMKFKPNQTRTYSRYPDQWIVPGGGME G
需要将其转换为Pandas DataFrame,要求:
- 以
>开头的行内容作为Name列 - 对应序列内容作为
Sequence列,保留多行显示的排版效果,最终呈现如下:
Name Sequence abc 123 MMKFKPNQTRTYSRYPDQWIVPGGGME GAAVREVYEEAGVKGKLGRLLGIFEQN NMNJ hik rre MMKFKPNPGDREGFKKRAACLCFRSEQ EDEVLLVSSQTRTYSRYPDQWIVPGGG MEPEEE dmd kij MMKFKPNQTRTYSRYPDQWIVPGGGME dmd 879 MMKFKPNQTRTYSRYPDQWIVPGGGME G
常规的FASTA转DataFrame代码无法满足该排版需求。
解决方案
1. 解析FASTA文件并构建基础DataFrame
手动逐行读取文件,分组记录名称和序列:
import pandas as pd # 替换为你的FASTA文件路径 file_path = "your_sequence.fasta" with open(file_path, "r") as f: # 读取所有非空行并去除首尾空白 lines = [line.strip() for line in f if line.strip()] records = [] current_name = None current_sequence = [] for line in lines: if line.startswith(">"): # 保存上一条记录(如果存在) if current_name is not None: records.append({ "Name": current_name, "Sequence": "\n".join(current_sequence) }) # 更新当前记录的名称 current_name = line[1:] current_sequence = [] else: current_sequence.append(line) # 保存最后一条记录 if current_name is not None: records.append({ "Name": current_name, "Sequence": "\n".join(current_sequence) }) # 构建基础DataFrame df = pd.DataFrame(records)
2. 设置样式实现目标排版
使用Pandas的Styler工具,调整单元格显示效果:
def render_sequence(seq): # 将换行符替换为HTML换行标签,实现单元格内换行 return seq.replace("\n", "<br>") # 配置表格样式 styled_table = df.style \ .set_properties(**{"text-align": "left", "white-space": "pre-wrap"}) \ .format({"Sequence": render_sequence}) \ .set_table_styles([ # 移除单元格边框 {"selector": "td, th", "props": [("border", "none")]}, # 设置表头对齐方式 {"selector": "th", "props": [("font-weight", "bold")]}, # 隐藏Name列中不需要显示的单元格 {"selector": ".row1 td:first-child, .row2 td:first-child, .row4 td:first-child", "props": [("visibility", "hidden")]} ]) # 显示样式化后的表格 display(styled_table)
关键说明
- 解析阶段:通过遍历行区分记录头和序列,将每条记录的名称和多行序列合并为带换行符的字符串,确保序列的换行信息被保留。
- 样式阶段:利用HTML的
<br>标签实现序列的单元格内换行,再通过CSS选择器隐藏Name列中重复的空行单元格,完全匹配目标排版效果。
内容的提问来源于stack exchange,提问作者user2110417
相关产品推荐
相关产品推荐

