【Pandas】解决循环输出为多个sheet时,数据覆盖的问题

pandas入门萌新,多多关注哈,
博主目前就是帮老师打打工,处理一些大批量的excel,csv数据。
只需通过查看代码直接查看解决方案。

1 我的任务

博主的任务是需要处理一个excel中的多个sheet,每个sheet中的操作相同,处理完成后再导出为一个excel中的多个sheet的状态。
sheet名称

2 网上相关代码整理,需要拿

csdn上已经有很多关于这类的代码,但是都没有解决我的情况。

2.1 每个sheet保存为一个pandas,然后逐个输出。

import pandas as pd
writer = pd.ExcelWriter('test.xlsx')
data1.to_excel(writer,sheet_name='sheet1')
data2.to_excel(writer,sheet_name='sheet2')
writer.save()

这个方法可行,但是放进循环的话会覆盖。。。有的时候,我们对于每个sheet采用的是相同的处理程序,所以会用到循环。所以这个defeat。

2.2 引入openpyxl,理论上不覆盖

import pandas as pd
from openpyxl import load_workbook
 
writer = pd.ExcelWriter('path_to_out).xlsx',engin='openpyxl')
book = load_workbook(writer.path)
writer.book = book
dataframe.to_excel(excel_writer=writer,sheet_name="sheet_name")
writer.save()
writer.close()

说是理论上是因为我没跑成功😥)我还是把这段代码放进了循环,但是这段代码我一直显示不成功,报错的那种。很气但还是defeat。

3 解决方案

我的问题大概就在于上述代码放在循环里就不好使了,但是如果不用循环。。不够专业😎(说peach)所以俺动了动小脑筋,想了个方法。

3.1 基本假设(符合的场景)

如果你和我一样,任务要求满足以下几点:
1、需要处理一个文件中的多个sheet,每个sheet的处理方式几乎相同,可以放进循环里
2、输出为一个文件的多个sheet

3.2 预处理

那么你可以做
①把sheet命名为有规律的名字,1期,2期,3期。或者自己定义一个字符串储存所有的sheet名。
②记得在文件夹下新建导出文件,path_to_out.xlsx。不然会显示查无此表。

3.3 代码

博主的想法是建立一个索引列表,然后每个列表元素对应一个pandas,这样的话,后续导出文件的代码就不用放在循环里了。处理数据时,可以用下标进行循环,所有sheet的数据都处理完后,再统一导出,就不存在覆盖的问题了。

大家根据情况修改。

#1.导入包
import pandas as pd

#2.设置变量
n = 5 #有几个sheet填几
#l是一个索引列表,每个列表元素对应一个pandas,这样储存的话,导出文件的代码就不用放在循环里了。
l = [pd.read_excel("path_to_in.xlsx",sheet_name=str(i)+"期")for i in range(1,n+1)]#sheet_name根据情况修改

#3.处理代码(循环)
for i in range(0,n): #开始进入每一个pandas
  #填入自己的处理代码
  '''
  #这里博主的任务是每个sheet的第二列及后面每一列数据的归一化(标准化),大家可以纠正一下
  for c in l[i].columns.values.tolist()[1:]:
        l[i][[c]] = l[i][[c]].astype(float)#原数据都是int,归一化后都是小数,需要更改类型。
        sum_c = sum(l[i][c])
        max_c = max(l[i][c])
        min_c = min(l[i][c])
    
        for t in l[i].index:
            l[i][c][t] = (l[i][c][t]-min_c)/(max_c-min_c)#标准化公式
    l[i] = l[i].set_index("编号")
  '''
#4.导出文件
with pd.ExcelWriter(r'path_to_out.xlsx') as writer:
    for m in range(0,n):
        l[m].to_excel(writer, sheet_name=str(m+1)+"期")

writer.save()
writer.close()

最后结果hin理想!🥰

上述代码有任何问题,欢迎大家一起交流哦,mark~

版权声明:本文为博主板砖板砖我是兔子原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/qq_43749398/article/details/123291273

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(1)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2022年3月6日 下午9:28
下一篇 2022年3月7日 下午4:50

相关推荐