遍历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
相关产品推荐
相关产品推荐

