本文参考公众号:拾图院 😏
感谢作者的帮助 🐄
大家可以加关注哦! 😏😏
笔记3(多Sheet保存、增加分组小计)
一、多个文件保存在同一个表格的不同sheet中 ❔❓
实际工作中可能需要将同一类型的数据保存在同一个表格中,而单纯的df.to_excel()只能保存单个文件,其使用说明如下:
To write a single object to an Excel .xlsx file it is only necessary to
specify a target file name. To write to multiple sheets it is necessary to
create an ExcelWriter
object with a target file name, and specify a sheet
in the file to write to.
大致意思就是只能保存单个文件,要想保存多个就要用ExcelWriter,而使用ExcelWriter时,若文件夹之前有数据就会覆盖掉。
实现这个功能,可能有多种方法,但则这个是比较方便的方法:😏😏
writer = pd.ExcelWriter('test.xlsx')
data1.to_excel(writer,sheet_name='sheet1')
data2.to_excel(writer,sheet_name='sheet2')
writer.save()
二、给聚合之后的数据添加小计行
之前的数据操作都是代码处理聚合,之后的数据手动添加小计,或者直接处理完的数据直接用Excel聚合,这样就有了想要的小计,但是随着数据的增加、需求的增加,这种重复性的工作就得要代码直接实现了。💦💦💦
使用的函数
df.assign():
函数介绍
Assign new columns to a DataFrame.
Returns a new object with all original columns in addition to new ones.
Existing columns that are re-assigned will be overwritten.
大致意思:给DataFrame新建一列,若列名存在则覆盖
1、用法一:增加新列
是不是想到了什么??😮😮
没错!该函数其实是一个增加列的方法,以下两段代码实现的功能一致:
data["新列"]=0
data.assign(新列=0)# 注意这里的列名没得引号哦!!
2、用法二:增加小计
首先明确思路:
1.增加小计是增加行,每类加一行
2.每分组聚合一次就加一行,最后把多次的分类聚合数据合起来
3.需要注意的是最内层的汇总相当于原始数据的复制,但它不同于原始数据是因为进行了分组聚合,它的索引和其他的一样,而原始数据的索引不一致,这也是为啥补直接和原始数据合并的原因
4.最后就是调整想要的效果了即按照索引排序
data = {
'a': ['Animal', 'Animal', 'Animal', 'Animal', 'Object', 'Object', 'Object', 'Object'],
'b': ['Ground', 'Ground', 'Air', 'Air', 'Metal', 'Metal', 'Wood', 'Wood'],
'c': ['Dog', 'Cat', 'Eagle', 'Owl', 'Car', 'Bike', 'Chair', 'Table'],
'Sce1': [0.0, 0.6, 1.0, 0.3, 0.3, 0.5, 0.9, 0.9],
'Sce2': [0.9, 0.5, 0.1, 0.1, 0.3, 0.1, 0.6, 0.6],
'Sce3': [0.5, 0.3, 0.1, 0.5, 0.8, 0.4, 0.1, 0.6],
'Sce4': [0.0, 0.5, 0.6, 0.3, 0.6, 0.7, 0.9, 0.1],
'Sce5': [0.3, 1.0, 0.9, 0.5, 0.5, 0.4, 0.2, 0.9],
'Sce6': [0.4, 0.2, 0.1, 0.9, 0.6, 0.2, 0.8, 0.7]
}
演示数据具体长这样
这是我最终想要的样子
分步实施:
1.增加最外层汇总
total_1 = df.assign(**{x: 'Total' for x in 'abc'}).groupby(by=list('abc')).agg('sum')
total_1
结果展示:相当于对所有数据进行了求和
2.增加第二层
total_2 = df.assign(**{x: 'Total' for x in 'abc'[1:]}).groupby(by=list('abc')).agg('sum')
total_2
结果展示:相当于对除了a列的数据进行了求和
3.增加第三层
total_3 = df.assign(**{x: 'Total' for x in 'abc'[2:]}).groupby(by=list('abc')).agg('sum')
total_3
结果展示:相当于对除了a,b列的数据进行了求和
4.增加第四层
total_4 = df.assign(**{x: 'Total' for x in 'abc'[3:]}).groupby(by=list('abc')).agg('sum')
total_4
这个其实已经没有求和了,只是为了把原始数据的索引和之前添加的三层总计保持一致
5.然后就是把所有的数据拼接起来
pd.concat([total_1, total_2, total_3, total_4])
貌似和预想的还有点不一样,别急,按索引排个序再看看
pd.concat([total_1, total_2, total_3, total_4]).sort_index()
一步步的理解了就可以把他们写在一起了
df = pd.concat(
[df.assign(**{x: 'Total' for x in 'abc'[i:]})
.groupby(by=list('abc')).agg('sum') for i in range(4)]
).sort_index()
df
结果展示和分布最终一样!大功告成
🐄🍺🐄🍺🐄🍺🐄🍺🐄🍺🐄🍺