Python自动化小技巧16——分类汇总写入excel不同sheet表

news2024/11/24 2:26:17

案例背景

上了两个月班的社畜博主最近终于有空来总结一下最近写的代码了。

因为上班都是文职工作,天天不是word就是excel就是PPT和pdf....这和什么机器学习还有数据科学不一样,任务更多的是处理实在的文字和表格等格式,按照领导要求来完成,数据什么都是次要的,主要是格式要求,数据运算最多都是加减乘除,都很简单。但是怎么呈现给领导看就会让代码过程变得复杂。

本次就是对一些固定资产进行一个分类汇总,比如领导想看我们固定资产里面有什么呀,有几台车,几个房屋,几台电脑,他们原值都是多少钱,折旧了多少钱....需要每一类的汇总,然后汇总了还不够,他还想看看每一类的明细.....总之就是很麻烦,如果没有python的话,那就是excel筛选,然后对每一类都进行复制,最后一行写一个sum()函数....再把所有的sum()行复制到一起,来一个整体的sum......

这种重复性的工作还是给代码来吧,所实话,类别多的情况下,写代码的时间都比复制粘贴的时间快,而且代码还能一直用,下次再来个什么别的东西进行分类汇总也是很方便的.....


明确目标

上面也说了,就是格式要求麻烦,对这样一个资产的表进行分类统计:

 我们需要对每种类别的资产都分开写入不同的sheet里面,后面都加上一行汇总项,然后还需要做一个总的汇总表。

(有些位置和数值都打了马赛克.....当然是怕信息泄露...)


代码实现

先导入包:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns

plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
plt.rcParams ['axes.unicode_minus']=False               #显示负号
import xlrd,openpyxl

还是数据分析四件套,但可能这个案例不需要,,,另外我现在习惯导入xlrd,openpyxl这两个处理excel表的包,虽然这个案例没用到,后面会用的。这个案例只依靠pandas就行。

读取数据,可以看到上面的表前两行没什么用,就跳过读取,然后把资产类别这一列变为字符串型进行读取,因为它有‘03’这种读取的话会默认变成数值型就变成‘3’了.....还进行了筛选,在用的资产都拿出来,报废的资产就不做统计了。

df=pd.read_excel('资产任意汇总表.xls',converters={'资产类别': str},skiprows=2)
df=df.iloc[:,2:].query("资产状态名称=='在用'").reset_index(drop=True)
df.head(2)

可以看到数据大概有哪些变量。我们主要是对资产类别名称这一列进行分类。然后再统计汇总,

我这里还做了一点小处理,主要是有的资产类别不对,需要进行替换映射一下,采用编号相同的情况下进行替换

df_change=pd.read_excel('资产变动台账.xls',converters={'资产编号': str},skiprows=2)
df_change[['新类别编号', '新类别名称']] = df_change['资产类别-变后值'].str.split('_', expand=True)
for num in df_change['资产编号'].unique():
    df.loc[df['资产编号'] == num, '资产类别'] = df_change.loc[df_change['资产编号'] == num, '新类别编号'].to_numpy()[0]
    df.loc[df['资产编号'] == num, '资产类别名称'] = df_change.loc[df_change['资产编号'] == num, '新类别名称'].to_numpy()[0]

查看资产类别数量统计:
 

df['资产类别'].value_counts()

 这些事类别的代号,然后写个字典,让代号和名称一一对应:

asset_category={'01': '公路及构筑物', '02': '房屋及建筑物', '03': '机械设备', '04': '运输设备', '05': '办公及电子设备', '06': '仪器及实验设备', '07': '安全设施', '08': '收费设施', '09': '通信监控设施', '10': '融资租赁及改良支出', '98': '土地', '99': '其他','0201': '办公用房','0202': '职工用房','0203': '仓库','0204': '客运站房屋','0205': '厂房','0206': '服务区','0207': '站所用房','02101': '非生产用房','02102': '建筑物及附属设施','02103': '房屋建筑物','0299': '其他','0301': '施工机械','0302': '生产及动力设备','0399': '其他','0401': '生产车辆','0402': '营运车辆','0403': '办公用车','0499': '其他','9901':'广告牌','9902':'其他设备'}
(df['资产类别'].map(asset_category)==df['资产类别名称']).all()

 这里的true表示数据里面的代号和名称都是一致的。


 资产分类计算导出

 开始正式的分类汇总的代码:

查看类型:

df['资产类别名称'].unique()

 直接计算汇总表,并且在最后一行加上汇总项:

df_sums=df.groupby('资产类别名称').sum(numeric_only=True).T.assign(汇总=lambda x:x.sum(1)).T
df_sums

 可以看到最后一行是汇总行,这是只保留的数值型数据的汇总,文字型数据都不见了。

如果需要明细,这种只保留数值是不行的。

我们自定义一个函数,可以对数据框加一行汇总,数值型数据就求和,字符串就为空:

def add_summary_row(df):
    numeric_df = df.select_dtypes(include=['number'])
    summary = numeric_df.sum()
    
    for col in df.columns.difference(numeric_df.columns):
        summary[col] = None
        
    result_df = pd.concat([df, pd.DataFrame(summary).T])
    result_df.index = list(range(len(df.index))) + ['汇总']

    return result_df

然后把每一类资产都进行这个函数的处理,写入excel不同的sheet里面,再加上一个汇总项表:

sheets = {'办公用房': '房屋建筑物','办公及电子设备': '办公及电子设备', '生产及动力设备': '生产及动力设备', 
          '办公用车': '办公车辆', '生产车辆': '生产车辆', '安全设施': '安全设施', '其他设备': '家具和其他','汇总':'汇总'}
with pd.ExcelWriter('汇总.xlsx') as writer:
    for key, value in sheets.items():
        df_temp=df[df['资产类别名称'] == key]  #取出每一类框
        df_temp=add_summary_row(df_temp)       #添加汇总项
        df_temp.to_excel(writer, sheet_name=f'{value}{len(df_temp)-1:.0f}')  #写入sheet,名称+数量
    df_sums.index=df_sums.index.map(sheets)
    df_sums.to_excel(writer, sheet_name='汇总') #写入汇总表

完成!!看看效果:

 

 可以看到下面很多sheet,分门别类了,数字是这个类型的资产有多少个。最后都有汇总,还有总汇总表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/880529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【vue.js】手把手教你做一个会躲避鼠标指针的登录按钮

效果 背景 在登录的时候&#xff0c;我们都会做账号密码不可为空的验证&#xff0c;如何做出一个会躲避鼠标指针的登录按钮呢。废话不多说&#xff0c;3、2、1&#xff0c;上代码~ 代码 <!DOCTYPE html> <html lang"en" style"overflow: hidden;&qu…

ad+硬件每日学习十个知识点(34)23.8.14 (DCDC详细设计,续流二极管的选择,COMP引脚的环路设计)

文章目录 1.二极管的rrm电压和rms电压有什么不同2.DCDC续流二极管的选择3.充电电容4.COMP引脚的环路设计5.DCDC设计总结6.多路并联7.相位匹配8.工作模式9.低温输出偏离10.电源负载与效率11.降压升压模块 1.二极管的rrm电压和rms电压有什么不同 答&#xff1a; 二极管的 RRM &a…

JS_围绕圆形滑动

需求&#xff1a;滑动手势最大不能超过一个半径为50的圆形&#xff0c;超出围绕圆形边线滑动 这里只提供一个思路&#xff0c;下面代码可以运行&#xff0c;但是要使用需要改成自己的参数 <div style"width: 100%;height: 100vh;display: flex;justify-content: cente…

从雷军代码再上热搜给程序员们的启示

不久前&#xff0c;小米的一则关于雷军的宣传广告火了&#xff0c;这个宣传广告里隐藏了菜单&#xff0c;那些密密麻麻的字母就是雷军曾经写的代码&#xff0c;据小米公关部负责人王化表示&#xff0c;这张海报上的代码来自30年前&#xff0c;雷军在DOS环境下采用汇编语言亲自编…

Java鹰眼轨迹服务 轻骑小程序 运动健康与社交案例

Java地图专题课 基本API BMapGLLib 地图找房案例 MongoDB 百度地图鹰眼轨迹服务 鹰眼轨迹服务概述 鹰眼是一套轨迹管理服务&#xff0c;提供各端SDK和API供开发者便捷接入&#xff0c;追踪所管理的车辆/人员等运动物体。 基于鹰眼提供的接口和云端服务&#xff0c;开发者可以迅…

【 BERTopic应用 02/3】 分析卡塔尔世界杯推特数据

摄影&#xff1a;Fauzan Saari on Unsplash 一、说明 这是我们对世界杯推特数据分析的第3部分&#xff0c;我们放弃了。我们将对我们的数据进行情绪分析&#xff0c;以了解人们对卡塔尔世界杯的感受。我将在这里介绍的一个功能强大的工具包是Hugging Face&#xff0c;您可以在…

Mac鼠标增强工具Smooze Pro

Smooze Pro是一款Mac上的鼠标手势增强工具&#xff0c;可以让用户使用鼠标手势来控制应用程序和系统功能。 它支持多种手势操作&#xff0c;包括单指、双指、三指和四指手势&#xff0c;并且可以自定义每种手势的功能。例如&#xff0c;您可以使用单指向下滑动手势来启动Expos视…

el-table分页后序号连续的两种方法

实现效果&#xff1a; 第一页排序到10&#xff0c;第二页的排序应从11开始 实现方法一&#xff1a; 在el-table的序号列中使用template定义 <el-table><el-table-columnmin-width"10%"label"序号"><template slot-scope"scope"…

使用pymupdf实现PDF内容搜索并显示功能

简介&#xff1a; 在日常工作和学习中&#xff0c;我们可能需要查找和提取PDF文件中的特定内容。本文将介绍如何使用Python编程语言和wxPython图形用户界面库来实现一个简单的PDF内容搜索工具。我们将使用PyMuPDF模块来处理PDF文件&#xff0c;并结合wxPython构建一个用户友好的…

比例电磁铁控制放大器

GP63系列比例电磁铁应用于电液比例控制系统中&#xff0c;与比例控制放大器配套使用共同控制力士(REXROTH)型十通径螺纹比例阀。在额定行程及额定电流范围内&#xff0c;其输出力与输入电流成比例&#xff0c;通过内置反力弹簧&#xff0c;改变了输出力的特性&#xff0c;使系统…

能源存储蓄电池管理,0基础也能快速上手!

随着能源储存需求的不断增加&#xff0c;蓄电池作为关键的能量储存装置&#xff0c;其稳定性和性能的监测变得尤为重要。 蓄电池监控有助于提高能源系统的可靠性&#xff0c;确保连续供电&#xff0c;同时为维护人员提供及时的故障信息&#xff0c;以便他们能够迅速采取适当的措…

百望云联合华为发布票财税链一体化数智解决方案 赋能企业数字化升级

随着数据跃升为数字经济关键生产要素&#xff0c;数据安全成为整个数字化建设的重中之重。为更好地帮助企业发展&#xff0c;中央及全国和地方政府相继出台了多部与数据相关的政策法规&#xff0c;鼓励各领域服务商提供具有自主创新的软件产品与服务&#xff0c;帮助企业在合规…

【AutoLayout案例03-设置底部按钮之间相同间距 Objective-C语言】

一、好,咱们继续啊 1.咱们继续把autoLayout介绍一下 咱们的自动布局 给大家介绍一下 那么,自动布局呢 继续咱们给大家做的案例 做几个例子 把这几个例子做完以后 我们再给它 我们再给大家说一下,如何通过代码,来实现自动布局 虽然说,通过代码来实现自动布局,并不推荐 但…

AIF360入门教学

1、AIF360简介 AI Fairness 360 工具包(AIF360)是一个开源软件工具包&#xff0c;可以帮助检测和缓解整个AI应用程序生命周期中机器学习模型中的偏见。在整个机器学习的过程中&#xff0c;偏见可能存在于初始训练数据、创建分类器的算法或分类器所做的预测中。AI Fairness 360…

UI自动化测试(下拉框(select类),多窗口,属性,类的方法实战)

一、下拉框&#xff08;select类实现的&#xff09; 在UI的自动化测试实战中&#xff0c;如果遇到下拉框的选择&#xff0c;我们可以使用Select类里面的方法来具体进行定位和解决。下面我们使用HTML的代码来写一个下拉框的页面交互&#xff0c;让大家从直观上知道下拉框的交互…

Node工程的依赖包管理方式

在前端工程化中&#xff0c;JavaScript 依赖包管理是非常重要的一环。依赖包通常是项目所依赖的第三方库、工具和框架等资源&#xff0c;它们能够帮助我们减少重复开发、提高效率并且确保项目可以正确的运行。 目前比较常见的前端包管理器有 npm 和 Yarn&#xff0c;npm 是 No…

16.3.2 【Linux】程序的管理

程序之间是可以互相控制的。举例来说&#xff0c;你可以关闭、重新启动服务器软件&#xff0c;服务器软件本身是个程序&#xff0c; 你既然可以让她关闭或启动&#xff0c;当然就是可以控制该程序。 使用kill-l或者是man 7 signal可以查询到有多少个signal。主要的讯号代号与名…

Stable Diffusion 告别复制关键词,高质量提示词自动生成插件

在使用SD时,我们经常会遇到心中无想法,或不知如何描述心中所想的图像。有时由于提示词的选择不当,生成的图片质量也不尽如人意。为此,我今天为大家推荐一个高质量的提示词自动生成插件——One Button Prompt。 下面是他生成的一些样图。 文章目录 插件安装插件说明主菜单工…

【Linux】可重入函数 volatile关键字 以及SIGCHLD信号

可重入函数 volatile关键字 以及SIGCHLD信号 一、可重入函数1、引入2、可重入函数的判断 二、volatile关键字1、引入2、关于编译器的优化的简单讨论 三、SIGCHLD信号 一、可重入函数 1、引入 我们来先看一个例子来帮助我们理解什么是可重入函数&#xff1a; 假设我们现在要对…

基于Yolov5与LabelMe训练自己数据的图像分割完整流程

基于Yolov5与LabelMe训练自己数据的实例分割完整流程 1. Yolov5配置2. 创建labelme虚拟环境4. 接下来开始使用labelme绘制分割数据集4.1 json to txt4.2 划分数据集(可分可不分) 5. 训练 1. Yolov5配置 参照这边文章&#xff1a; https://blog.csdn.net/ruotianxia/article/de…