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

如何用Python3的Pandas合并含重复表头的DataFrame并整理数据

如何用Pandas规整含重复表头与空行的蛋白质数据文件

嘿,我来帮你搞定这个Pandas数据清理的问题!先理清楚你的场景:你的工具输出的文件每一组数据前都重复了表头,还有空行,导致读取后DataFrame乱糟糟的,还丢了Organism列。下面给你两种实用的解决办法:


你的问题场景

工具输出的原始文件格式(共1000组):

Entry Entry name Status Protein names Gene names Organism
A0A20CSC4 A0A20CSC4_1PHYC unreviewed Uncharacterized protein OlL7_200 Ostreococcus lucimarinus virus 7
Entry Entry name Status Protein names Gene names Organism
A0A0P0DZ8 A0A0PCDZ8_9PLYC unreviewed Uncharacterized protein OlL7_159 Ostreococcus lucimarinus virus 7
……

读取后得到的混乱DataFrame:

>>> blast
   Entry Entry name    Status         Protein names Gene names
0  A0A20CSC4  A0A20CSC4_1PHYC  unreviewed  Uncharacterized protein  OlL7_200
1   NaN        NaN         NaN                    NaN        NaN
2  A0A0P0DZ8  A0A0PCDZ8_9PLYC  unreviewed  Uncharacterized protein  OlL7_159
3   NaN        NaN         NaN                    NaN        NaN
4  Entry  Entry name    Status         Protein names Gene names
5  A0A1P0BY71  A0A1P0BY71_9PHYC  unreviewed  Uncharacterized protein  OlL7_111c

你想要的最终效果:仅含唯一表头,所有数据行规整排列,且包含Organism列。


解决方案

方式一:从原始文件直接读取并清理(推荐)

这种方法从源头解决问题,避免后续处理脏数据的麻烦,还能确保Organism列完整读取:

import pandas as pd

# 先定义我们需要的完整表头
target_columns = ['Entry', 'Entry name', 'Status', 'Protein names', 'Gene names', 'Organism']

# 读取文件:跳过空行,不自动识别表头,用空格作为分隔符
raw_data = pd.read_csv(
    'your_protein_file.txt',  # 替换成你的实际文件路径
    sep='\s+',  # 匹配任意数量的空格(适配文件中的分隔格式)
    header=None,  # 告诉Pandas不要把第一行当表头
    skip_blank_lines=True  # 自动跳过空行
)

# 筛选出真正的数据行:排除那些以'Entry'开头的表头行
clean_data = raw_data[raw_data[0] != 'Entry']

# 给数据行设置正确的表头,然后重置索引
clean_data.columns = target_columns
final_df = clean_data.reset_index(drop=True)

# 查看规整后的结果
print(final_df)

方式二:清理已读取的混乱DataFrame

如果你已经读取了那个有问题的blast DataFrame,可以这样补救:

import pandas as pd

# 第一步:删除所有全是NaN的空行
no_empty_rows = blast.dropna(how='all').reset_index(drop=True)

# 第二步:过滤掉重复的表头行(表头行的Entry列值是'Entry')
no_duplicate_headers = no_empty_rows[no_empty_rows['Entry'] != 'Entry'].reset_index(drop=True)

# 第三步:补全丢失的Organism列
# 从你的示例看,所有数据的Organism都是同一个值,直接赋值即可
no_duplicate_headers['Organism'] = 'Ostreococcus lucimarinus virus 7'

# 最终的规整DataFrame
final_df = no_duplicate_headers
print(final_df)

小提示

  • 如果你的Organism列值不固定,一定要用方式一读取,否则会丢失这列的信息。
  • sep='\s+'是关键,因为你的文件是用空格分隔的,这个参数能适配不同数量的空格分隔。

内容的提问来源于stack exchange,提问作者chippycentra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 06:23:28