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

Python拼接字典存储的多Excel DataFrame:合并Genes、填NaN删Ratio

问题根因说明

之前的代码拼接后出现文件名分层索引、求和结果异常的原因有两个:

  1. 直接将{文件名: DataFrame}格式的字典传入pd.concat时,pandas会自动将字典的键作为最外层列索引,生成带文件名的多级分层列结构,无法直接合并同名列。
  2. 后续调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.24 01:24:04