Python拼接字典存储的多Excel DataFrame:合并Genes、填NaN删Ratio
问题根因说明
之前的代码拼接后出现文件名分层索引、求和结果异常的原因有两个:
- 直接将
{文件名: DataFrame}格式的字典传入pd.concat时,pandas会自动将字典的键作为最外层列索引,生成带文件名的多级分层列结构,无法直接合并同名列。 - 后续调用
groupby(axis=1).sum()时,分组键是带文件名的多层列元组,无法将不同文件下的同名列归为一组;同时求和操作会将文本类型的Genes列纳入计算,文本列无法参与数值求和,自然得不到预期结果。
调整后的实现代码
import numpy as np import pandas as pd import os folder = r'C:\Users\camer\Desktop\Stack Overflow' excel_df_list = [] # 遍历读取Excel文件,边读边做初步清洗 for file in os.listdir(folder): if file.endswith('.xlsx'): file_path = os.path.join(folder, file) df = pd.read_excel(file_path) # 删除所有列名含Ratio的列(不区分大小写,兼容大小写命名的Ratio列) ratio_cols = [col for col in df.columns if 'ratio' in str(col).lower()] df = df.drop(columns=ratio_cols) excel_df_list.append(df) # 拼接所有清洗后的DataFrame,传列表而非字典,不会生成带文件名的分层列索引 merged_df = pd.concat(excel_df_list, axis=1) # 合并重复出现的Genes列 genes_cols = [col for col in merged_df.columns if str(col) == 'Genes'] if len(genes_cols) > 1: # 校验重复Genes列的内容一致性,避免行错位导致的标签错误 reference_genes = merged_df[genes_cols[0]] for col in genes_cols[1:]: if not reference_genes.equals(merged_df[col]): print(f"警告:{col} 列与第一列Genes的内容不一致,请检查文件行对齐问题") # 仅保留第一列Genes,删除其余重复列 merged_df = merged_df.drop(columns=genes_cols[1:]) # 将所有分数列的NaN值填充为0(自动跳过文本类型的Genes列) merged_df = merged_df.fillna(0) # 兜底检查,清除拼接过程中遗漏的Ratio列 final_ratio_cols = [col for col in merged_df.columns if 'ratio' in str(col).lower()] merged_df = merged_df.drop(columns=final_ratio_cols)
步骤对应需求说明
- 拼接时传入DataFrame列表而非原始字典:彻底消除生成文件名单层索引的可能,得到单层普通列名的结果
- 全流程两次清理Ratio列:兼容不同大小写、不同列名变体的Ratio字段,完全满足删除要求
- 重复Genes列仅保留一列并加校验:合并所有重复的Genes标签列,不会将文本列纳入数值计算,同时能提前发现行错位的问题
- 合并后统一填充NaN为0:对数值类型的分数列空值补0,不影响Genes文本列的内容
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

