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

遍历Excel多工作表处理后仅保存首个表,如何保存全部修改表

问题解决:批量处理Excel多工作表并保存全部内容

问题根源分析

你的代码存在两个关键问题导致仅能保存单个工作表:

  • 文件覆盖问题:循环内每次调用df.to_excel()都会创建新文件并覆盖原有内容,最终只会保留最后一次循环处理的工作表(若你看到仅第一个工作表,可能是后续循环抛出异常终止)。
  • 未生效的NaN填充:df.fillna(0)默认返回新的DataFrame,未对原对象进行修改,导致NaN值未被实际填充。

修正后的代码

import numpy as np
import pandas as pd 

def my_fun(g):
    # 转换为数值类型,处理非数值内容
    g["Normalized Area"] = pd.to_numeric(g["Normalized Area"], errors='coerce')
    # 找到Normalized Area等于1的行
    row_with_1 = g[g["Normalized Area"] == 1]
    
    # 增加空值检查,避免索引错误
    if row_with_1.empty:
        print(f"Metabolite {g.name}未找到Normalized Area为1的行")
        g["Semi Quantitative Conc"] = np.nan
        return g
    
    e_value = row_with_1.iloc[0]["Metabolite Conc Theory"]
    # 计算半定量浓度
    g["Semi Quantitative Conc"] = g["Normalized Area"] * e_value
    return g

# 读取所有工作表到字典(键为工作表名,值为DataFrame)
input_path = r'C:\Users\zj\Ad relative measurements to semi-quantitative.xlsx'
dfs = pd.read_excel(input_path, sheet_name=None)

# 创建ExcelWriter对象,用于批量写入多工作表
output_path = r'C:\Users\zj\处理后的结果.xlsx'  # 建议使用不同文件名避免覆盖原文件
with pd.ExcelWriter(output_path) as writer:
    # 遍历每个工作表名和对应的DataFrame
    for sheet_name, df in dfs.items():
        # 填充NaN为0(原地修改或重新赋值)
        df.fillna(0, inplace=True)
        # 应用自定义函数
        processed_df = df.groupby("Metabolite", group_keys=False).apply(my_fun)
        # 将处理后的DataFrame写入指定工作表
        processed_df.to_excel(writer, sheet_name=sheet_name, index=False)  # index=False避免写入行索引

关键改进点说明

  • 使用pd.ExcelWriter上下文管理器,一次性将所有处理后的工作表写入同一个文件,避免覆盖。
  • 修正fillna操作:通过inplace=True原地修改DataFrame,或使用df = df.fillna(0)重新赋值。
  • 遍历字典时同时获取工作表名和DataFrame,确保写入时保留原工作表名称。
  • 在自定义函数中增加空值检查,避免因找不到Normalized Area=1的行而抛出索引错误。
  • 建议使用不同的输出文件名,防止误覆盖原始数据文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 04:07:27