随笔--笔记3(多Sheet保存、增加分组小计)

本文介绍了如何使用pandas在Excel中保存多个数据集到不同工作表,并展示了如何为聚合后的数据添加小计行。通过`pd.ExcelWriter`实现多Sheet保存,利用`df.assign()`函数创建小计行,逐步实现不同层级的汇总。最后通过`pd.concat`和`sort_index`整理结果。
摘要由CSDN通过智能技术生成

本文参考公众号:拾图院   😏
感谢作者的帮助   🐄
大家可以加关注哦!   😏😏

笔记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

结果展示和分布最终一样!大功告成

🐄🍺🐄🍺🐄🍺🐄🍺🐄🍺🐄🍺

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值