如何修改Python代码将多个.npy数据合并写入单个Excel文件?
问题:合并多个NPY文件的统计结果到单个Excel文件
现有代码会为每个输入的.npy文件生成独立的Excel文件,需求是将所有.npy文件的统计数据以行的形式整合到同一个Excel文件中。
原代码:
import numpy as np import pandas as pd from pathlib import Path in_folder = Path("input folder directory") out_folder = Path("output folder directory") for in_file in in_folder.glob("*.npy"): out_file = out_folder / in_file.name.replace("_x.npy", "_data.xlsx") data = np.load(str(in_file)) percentage_coverage = ((np.count_nonzero(data == 3) / (np.count_nonzero(data == 3) + np.count_nonzero(data == 2) + np.count_nonzero(data == 4))) * 100) df = pd.DataFrame({'Percentage of Coverage': [percentage_coverage], 'Plaque Pixel Number': [np.count_nonzero(data == 3)], 'Brain Pixel Number': [np.count_nonzero(data == 2)], 'Not Brain Pixel Number': [np.count_nonzero(data == 1)], 'Fold Pixel Number': [np.count_nonzero(data == 4)]}) writer = pd.ExcelWriter(str(out_file), engine = 'xlsxwriter') df.to_excel(writer, sheet_name = 'Sheet1', index = False) writer.close()
修改后的代码
import numpy as np import pandas as pd from pathlib import Path in_folder = Path("input folder directory") out_folder = Path("output folder directory") # 创建空列表存储所有文件的统计数据 all_stats = [] for in_file in in_folder.glob("*.npy"): data = np.load(str(in_file)) # 提前计算各类像素数量,避免重复调用count_nonzero plaque_count = np.count_nonzero(data == 3) brain_count = np.count_nonzero(data == 2) not_brain_count = np.count_nonzero(data == 1) fold_count = np.count_nonzero(data == 4) # 计算覆盖率 percentage_coverage = (plaque_count / (plaque_count + brain_count + fold_count)) * 100 # 将当前文件的统计结果(含文件名便于区分)存入字典,添加到列表 file_stats = { 'Filename': in_file.name, 'Percentage of Coverage': percentage_coverage, 'Plaque Pixel Number': plaque_count, 'Brain Pixel Number': brain_count, 'Not Brain Pixel Number': not_brain_count, 'Fold Pixel Number': fold_count } all_stats.append(file_stats) # 将所有统计数据合并为一个DataFrame,每个文件对应一行 combined_df = pd.DataFrame(all_stats) # 设置统一的输出文件路径 output_file = out_folder / "combined_stats.xlsx" # 写入单个Excel文件 writer = pd.ExcelWriter(str(output_file), engine='xlsxwriter') combined_df.to_excel(writer, sheet_name='Sheet1', index=False) writer.close()
关键改动说明
- 新增空列表
all_stats,用于集中收集每个文件的统计数据,避免循环中重复创建和写入Excel - 循环内不再单独生成Excel文件,而是将每个文件的统计结果(新增文件名字段便于溯源)以字典形式存入列表
- 循环结束后,一次性将列表转换为DataFrame,此时每个文件的统计结果自动对应一行数据
- 最后统一将合并后的DataFrame写入单个Excel文件,完成需求
内容的提问来源于stack exchange,提问作者Diego Caron
相关产品推荐
相关产品推荐

