烟台定制网站建设报价,网络营销方式有哪些自动售货机景区运营,建一个网站 服务器机房托管价格,做家乡特产的网站案例背景
上了两个月班的社畜博主最近终于有空来总结一下最近写的代码了。
因为上班都是文职工作#xff0c;天天不是word就是excel就是PPT和pdf....这和什么机器学习还有数据科学不一样#xff0c;任务更多的是处理实在的文字和表格等格式#xff0c;按照领导要求来完成天天不是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 snsplt.rcParams [font.sans-serif] SimHei #显示中文
plt.rcParams [axes.unicode_minus]False #显示负号
import xlrd,openpyxl
还是数据分析四件套但可能这个案例不需要另外我现在习惯导入xlrd,openpyxl这两个处理excel表的包虽然这个案例没用到后面会用的。这个案例只依靠pandas就行。
读取数据可以看到上面的表前两行没什么用就跳过读取然后把资产类别这一列变为字符串型进行读取因为它有‘03’这种读取的话会默认变成数值型就变成‘3’了.....还进行了筛选在用的资产都拿出来报废的资产就不做统计了。
dfpd.read_excel(资产任意汇总表.xls,converters{资产类别: str},skiprows2)
dfdf.iloc[:,2:].query(资产状态名称在用).reset_index(dropTrue)
df.head(2) 可以看到数据大概有哪些变量。我们主要是对资产类别名称这一列进行分类。然后再统计汇总
我这里还做了一点小处理主要是有的资产类别不对需要进行替换映射一下采用编号相同的情况下进行替换
df_changepd.read_excel(资产变动台账.xls,converters{资产编号: str},skiprows2)
df_change[[新类别编号, 新类别名称]] df_change[资产类别-变后值].str.split(_, expandTrue)
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_sumsdf.groupby(资产类别名称).sum(numeric_onlyTrue).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] Noneresult_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_tempdf[df[资产类别名称] key] #取出每一类框df_tempadd_summary_row(df_temp) #添加汇总项df_temp.to_excel(writer, sheet_namef{value}{len(df_temp)-1:.0f}) #写入sheet名称数量df_sums.indexdf_sums.index.map(sheets)df_sums.to_excel(writer, sheet_name汇总) #写入汇总表
完成看看效果 可以看到下面很多sheet分门别类了数字是这个类型的资产有多少个。最后都有汇总还有总汇总表。