如何用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
相关产品推荐
相关产品推荐

