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

如何修改Python脚本批量处理多Excel文件并生成对应新DataFrame

批量处理Excel文件并生成关联命名DataFrame

问题根源

原代码的核心问题出在文件名/数据对象的处理逻辑上:

  • 错误地将DataFrame对象作为字典键传入ingest_excel_files函数,而DataFrame是不可哈希类型,无法作为字典键使用
  • 处理逻辑没有关联原文件名生成带_new后缀的目标DataFrame
  • 操作函数仅修改原DataFrame,未保留处理后的独立副本

修正后的代码

import pandas as pd

def ingest_excel_files(file_paths):
    """读取多个Excel文件,返回以原文件名为键的DataFrame字典"""
    data_frames = {}
    for file_path in file_paths:
        # 提取不带后缀的文件名,比如"file1.xlsx"转为"file1"
        file_name = file_path.split('.')[0]
        data_frames[file_name] = pd.read_excel(file_path)
    return data_frames

def process_and_create_new_dfs(data_frames):
    """对每个DataFrame执行计算,生成带_new后缀的独立DataFrame,存入字典返回"""
    new_data_frames = {}
    for file_name, df in data_frames.items():
        # 创建副本避免修改原数据
        df_new = df.copy()
        df_new["New Column"] = df_new["Column A"] + df_new["Column B"]
        # 用原文件名+_new作为键存储
        new_data_frames[f"{file_name}_new"] = df_new
        # 可选:保存处理后的Excel文件
        df_new.to_excel(f"{file_name}_new.xlsx", index=False)
    return new_data_frames

if __name__ == "__main__":
    # 要处理的4个Excel文件路径
    file_paths = ["file1.xlsx", "file2.xlsx", "file3.xlsx", "file4.xlsx"]
    # 读取原始数据
    original_dfs = ingest_excel_files(file_paths)
    # 处理并生成带_new后缀的DataFrame
    new_dfs = process_and_create_new_dfs(original_dfs)
    
    # 示例:访问处理后的DataFrame
    print("处理后的file1_new数据:")
    print(new_dfs["file1_new"])
    print("\n处理后的file4_new数据:")
    print(new_dfs["file4_new"])

关键调整说明

  • 读取文件时提取纯文件名作为字典键,避免文件后缀干扰
  • 处理时创建DataFrame的副本,保证原数据不被修改,同时生成独立的_new版本
  • 用字典统一管理所有处理后的DataFrame,键名与原文件名直接关联(如file1对应file1_new)
  • 可选保存处理后的Excel文件,命名规则与DataFrame保持一致

匹配预期效果

修正后的代码执行后,new_dfs字典中会包含file1_new、file2_new、file3_new、file4_new四个独立的DataFrame,每个都已添加计算后的New Column,完全匹配预期需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 12:45:17