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

Python中以gene_short_name为索引合并多文件FPKM列的问题求助

问题分析与解决方案

原代码的核心问题

  1. collected_columns被重复初始化:循环内每次都重新定义collected_columns = [df['gene_short_name'],],导致之前文件的列全部被覆盖,最终只保留最后一个文件的数据。
  2. 排序参数错误:sort_values(by=df['gene_short_name'], ascending=True, axis=1)中,by应该传入列名字符串'gene_short_name'而非Series;且axis=1是按列排序,这里需要按行排序(默认axis=0可省略)。
  3. 去重操作未生效:df.drop_duplicates(...)默认inplace=False,需要赋值给变量或添加inplace=True才会修改原DataFrame。

修正后的代码

推荐用merge方法自动匹配基因名,无需手动排序,确保每个样本的FPKM值与gene_short_name精准对应:

import pandas as pd
import glob

# 获取所有目标文件路径
file_list = glob.glob('/Cufflinks_Output/*.cufflinks.genes.fpkm_tracking')

# 初始化最终DataFrame
final_df = None

for file in file_list:
    # 读取制表符分隔的文件
    df = pd.read_csv(file, delimiter="\t")
    
    # 去重:保留第一个出现的gene_short_name
    df = df.drop_duplicates(subset=['gene_short_name'], keep='first')
    
    # 只保留需要的两列,减少数据处理量
    df = df[['gene_short_name', 'FPKM']]
    
    # 提取样本ID:从文件名中截取前缀
    sample_id = file.split('/')[-1].split('.cufflinks.genes.fpkm_tracking')[0]
    
    # 重命名FPKM列为样本ID+FPKM
    df.rename(columns={'FPKM': f'{sample_id}_FPKM'}, inplace=True)
    
    # 合并数据:第一个文件直接作为初始df,后续文件按gene_short_name合并
    if final_df is None:
        final_df = df
    else:
        final_df = pd.merge(final_df, df, on='gene_short_name', how='inner')

# 可选:将gene_short_name设为索引,让表格更整洁
final_df.set_index('gene_short_name', inplace=True)

print(final_df.head())

代码说明

  • merge的优势:通过on='gene_short_name'合并,自动对齐不同文件中相同基因名的行,完全避免排序错误导致的匹配问题。
  • how='inner':只保留所有样本中都存在的基因(如果需要保留所有基因,可改为how='outer')。
  • 去重与列筛选:提前去重和筛选列,减少内存占用,提升处理效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:45:41