在循环中将多个 DataFrame 对象写入同一个 Excel 文件的不同 sheet 中

        在写毕设的过程中,每次使用kmeans聚类后,得到带有标签的DataFrame的数据,想要将它们保存在一个Excel文件的不同sheet,但是网上找到的资料要么覆盖掉了,要么各种报错。

        包括但不仅限于:

        ValueError: Sheet '转速' already exists and if_sheet_exists is set to 'error'.

        raise IndexError("At least one sheet must be visible")IndexError: At least one sheet must be visible

        raise BadZipFile("File is not a zip file")zipfile.BadZipFile: File is not a zip file

        raise KeyError(KeyError: "There is no item named '[Content_Types].xml' in the archive"

        等等各种奇奇怪怪的错误,顺着这些报错再去找解决方法,又是各种报错。关于这些报错,我的能力有限没能解决,这里没有解决方法。

        不过试到最后,我跑通了一个稍微有点复杂但能实现上面目的的代码。

        主要思路是:先在一个文件夹里保存生成的多个Excel表格(每个表格的名字就是这个系统的名称),再把这个文件夹里的Excel表格合成到一个excel表格中,不同的文件名就是sheet名。再过河拆桥,把那些没用的文件删了。(很简单的思路吧)

#这是那个需要循环使用的大冤种计算程序
def kmeans_julei(Data ,system_name):
    #这里省略Data计算过程
    #保存到excel。【这里原本想做成每次生成的数据都添加到一个xlsx文件的同sheet中,但没能成功】 迂回战术:先生成多个表格,再将它们总和到一xlsx里。
    #将各个excel表格先放进一个文件夹里。
    folder_path = 'D:\\XX\\XX\\XX\\temporary' #文件夹路径
    file_name = system_name + ".xlsx" # 输出文件名
    file_path = os.path.join(folder_path, file_name)
    Data_with_label.to_excel(file_path) #然后就会发现那个文件夹路径里出现了需要的一系列excel表格

#这个好像叫main过程,先这样写了
DATA = pd.read_excel(r'shuju.xlsx')
system_names = ["1111","2222","3333"]
all_dict = {"1111":['A'],'2222':['B', 'C'],'3333': ['E','F']}
for system_name in system_names:  
    print("开始",system_name)
    features = all_dict[system_name] #该系统下所选取的特征
    Data = DATA[features]  #Data是Dataframe结构(带有标题)。只包括了所需要的特征
    kmeans_julei(Data, system_name)


#生成最后的总合excel。(将多个 Excel 表合并到一个 Excel 表中的不同 sheet 里)
folder_path = 'D:\\XX\\XX\\XX\\temporary' # 文件夹路径
output_file = 'output.xlsx' # 输出文件名
writer = pd.ExcelWriter(output_file)
for file in os.listdir(folder_path):
    if file.endswith('.xlsx'):
        file_path = os.path.join(folder_path, file)
        df = pd.read_excel(file_path)
        sheet_name = os.path.splitext(file)[0]
        df.to_excel(writer, sheet_name=sheet_name)
        os.remove(file_path) # 删除原文件
writer.close()  #碎碎念:之前按网上写的witer.save()一直报错。查了篇文章说因为pandas升级。writer.save()接口已经私有化,调用close()即可。
print("已完成!耶")


第一次写文章,自娱自乐叭~

本人很菜,初学者,如有错误,你也打不着我。(不过我今天一下午整这个是实现了的)

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值