Python中以gene_short_name为索引合并多文件FPKM列的问题求助
问题分析与解决方案
原代码的核心问题
collected_columns被重复初始化:循环内每次都重新定义collected_columns = [df['gene_short_name'],],导致之前文件的列全部被覆盖,最终只保留最后一个文件的数据。- 排序参数错误:
sort_values(by=df['gene_short_name'], ascending=True, axis=1)中,by应该传入列名字符串'gene_short_name'而非Series;且axis=1是按列排序,这里需要按行排序(默认axis=0可省略)。 - 去重操作未生效:
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
相关产品推荐
相关产品推荐

