python对excel表格数据的统计和分析,python进行excel数据分析
Python数据统计前言样本数据早期想法实际问题和解决方案最终结果实现代码摘要
序
看来Excel在数据统计和处理方面的应用还是比较广泛的。前两天广发发来指令,要求帮忙统计2019年所有员工(每个月可能会有新员工)的养老保险、医疗保险、失业保险、工伤、生育五项公司缴费情况。需要全年积累,最后放到地区公司发的汇总表里。看起来不难,但也需要整理。
样本数据的原始数据如下所示(12个表)。
所需的表格如下
早期想法(1)1)python Excel的读写操作
(2)所有员工数据提取的统计操作,这里字典类型适用(字典是可变数据类型)。字典的键是员工的名字,对应的值是五个元素的列表(以后需要累积更改)。
(3)3)python写Excel的时候,需要匹配人的判断,因为最后汇总表的人很多
实践中遇到的问题及解决方法(1)在如何提取数据?的原始数据中,公司包含无法通行的部门,每个部门都有相应的汇总栏,影响数据提取。通过观察,A列数据的序号在对应的员工列只有数字序号标识,而汇总列为空。因此,可以通过判断A列是否为数值来提取员工信息。
(2)存在None值。对应的员工信息中有空值,如axdjzg的医保部分。为了不影响后续的累加运算,需要对数据进行处理,将空值转换为数字0。
(3)数据提取。由于GF样本数据表中的养老保险、医疗保险、失业保险、工伤、生育是用公式计算的,所以字典中的键值对的取值结果是一个字符串列表,元素为=ROUND(D4*19%,2),数值不能累加。
(a)解决方案a.同样提取对应列的数据,然后计算对应的保险数据。因为计算结果是浮点数,最后12个月累计结果有小尾数问题,结果与手工结果不符,所以失败结束。
(二)方案b .首先处理Excel表,清除所有公式,只保留数据。采用的方法是Excel VBA编程,详见[1] [2]。
(4)列表对应项相加。提取结果。从每张纸上提取一个字典。由于字典的值是列表,所以在操作过程中需要对值列表进行累加和求和。python中链表的加法()是拼接运算,不像MATLAB中的矩阵运算。此时可以使用Numpy库进行数组操作或者循环添加相应的项。这里使用的是循环。
最终结果(1)测试输出
外放大炮:[20900,840,8400,65,600]
(2)写表数据。
实现代码# By WDL 2020-4-27导入openpyxl#单元格数据判断函数,消除空单元格中读入的空值def value change(sth):#判断是否为none if sth==none:sth=0 return sth # Excel表读取函数def excelread(wb,sheet Name):# WB Workbook sheet Name Table Name ws=WB[sheet Name]#键入工作表#读取数据,在Excel中逐行读出一张工作表,为ws.rows中的行保存一个二维列表total _ list=[]为row . rows:row _ list=[]为row中的单元格:row _ list . append(cell . value)total _ list . append(row _ list)#为返回读取的数据列表,每个元素为工作表中返回total_list#表数据处理函数的一行,数据提取为def procSheet(wb,sheetname): #wb工作簿sheetname表名total_list=excelread(wb, Sheetname) #使用字典存储数据infos={ } for Term in total _ list:if is instance(Term[0],int): #确定标签是否为数值#使用sheet中列的标签确定元组中每个单元格的索引# term[2]对应名称# Term[4]for the older,Term[8]失业,term[12]医疗,term[16]工伤,term[17] #生育信息。 设置默认值(term [2],[])。extend ([value change (term [4]),value change (term [8])),\ Value (term [12]),value change (term [16]),Value change(term[17]))]#以上是一个密钥对列表的字典。如果关键项[2]不存在,则添加一个键值对,默认只有空列表[],然后用extend()方法展开列表返回infos #-WB=openpyxl . load _ workbook( XXX公司应付社会保险列表(2019。Data=procsheet (WB, 2019年1月)#初始值print (data) sheetnames=[2019。{}.format (str (I)) for I in range (2,13)]for sheet names in sheet names:infos=proc sheet(WB,Sheetname) for name in infos: #列出相应的项累积if name in data:for I in range(len(data[name]):data[name][I]=infos[name][I]else:data[name]=infos[name]Print(data)#最终统计打印(传出炮:, 数据[外向炮]) worker=set(数据)print(worker)# XXX公司全体员工统计# - #打开工作表写数据workbook=openpyxl . load _ workbook( 2019年XXX地区年薪人员人工费统计表. xlsx) worksheet=workbook [附表2,2019年人工费汇总] #将worksheet.iter _ rows (min _ row=1, min _ col=1,max _ row=400,Max_col=47):#每行的元组类型#使用sheet中列的标签判断元组中每个单元格的索引,如果eahcommonrow [8]。 数据中的值:#无论名字是否在字典中,第I列对应的索引是9-1=8 eahcommonrow [37]。value=data [eahcommonrow [8]。value] [0] #养老保险eahcommonrow [38]。value=data [eahcommonrow [8]。value] [2] #医疗保险eahcommonrow [39]。value=data [EACHCommonrow [8]。value] [1] #失业保险EACHCommonrow [40]。value=data [EACHCommonrow [8]。value] [3] #工伤保险eachCommonRow[41]。value=data [eahcommonrow [8]。value] [4] #生育保险# save workbook . save( 2019年XXX地区年薪员工人工费统计表。xlsx’)总结在实践中不断修正完善,利用好搜索能力,不断总结提高,减少工作量。最后,希望对大家有帮助。
参考文献
[1]excel删除公式和保留值的两种方法。http://www.ittribalwo.com/article/1369.html
【2】excel表格问题。如何清除公式保留数据?https://www.zhihu.com/question/21638771
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。