You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将特定格式的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 15:45:14