python之excel数据读取与分类累加

python之excel数据处理入门学习(1)

本次使用excel案例为2020年数学建模大赛C题部分示例

一、读取excel

要进行excel处理,首先需要将excel数据读入python中。这里推荐使用openpyxl读取excel文件。具体下载步骤不作讲述,直接上代码:

import openpyxl

wb = openpyxl.load_workbook("1.xlsx")

首先将自己的excel文件放置于工程中,这样可以方便引用。在此博主将文件名改为“1.xlsx”,方便导入

通过该步骤,定义一个wb(workbook)将xlsx文件读入进来了。

二、读取sheet

众所周知,excel结构为 工作簿,sheet,行列单元格

此前已读入wb为workbook,该变量中包含了原xlsx表中的多个sheet,在知道表名的情况下,可以这样引用:

sheet1=wb['mysheet']

在此我们print一下:

print(sheet1)

得到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AIpU9bsu-1662307049291)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20220904233307318.png)]

由此可见,这是一个Worksheet类型的变量。

从引用方式可以很清楚地看出workbook与sheet之间的从属关系,那么反过来由从属关系来记忆这样的存储方案是不是也是很容易呢?

既然是从属关系,我们便经常会去遍历整个工作簿中呢sheet,那么遍历应当用到什么?

当然是for循环了!

for sheet in wb:
    a=sheet
    print(a)

通过Worksheet a遍历了整个工作簿。

三、引用单元格

同工作簿和工作表的关系一样,工作表与单元格也是从属关系,单元格有如下属性:

1)单元行

2)单元列

3)单元格内容

可采用如下方式引用单元格。

A1=sheet1['A1']

我们打印一下:

print(sheet1['A1'])

可得到:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xctEmsPY-1662307049292)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20220904233009908.png)]

可见A1为Cell类型变量。

要引用单元格中的内容,可采用如下方案:

sheet1['A1'].value,sheet1['A1'].row,sheet1['A1'].column

value为内容,row为行,column为列

有时需要规定单元格的范围,可采用如下定义方案:

rowrange = a['2:6']
columnrange = a['B:C']

这样便定义了行与列的范围,在实际遍历时进行引用。

三、实例

下面通过实例进行进一步的学习:

根据题意统计进项发票信息中各个企业的金额总数,发票数量,有效发票数量

表格信息如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QZtEWWyS-1662307049293)(C:\Users\user\AppData\Roaming\Typora\typora-user-images\image-20220904234028176.png)]

1.确定数据结构:

我们要完成题设的统计各个企业金额,发票数量,有效发票数量,首先应当理清这当中的数据结构。

可以得知,若以每个企业为单位的话,每个企业中应当包含金额,发票数量,有效发票数量三个量。

那么我们将企业定义为一个字典,字典下辖金额,发票数量,有效发票数量。

2.文件读取与定义:

确定完数据结构后,便进行xlsx文件的读取,代码如下:

wb = openpyxl.load_workbook("1.xlsx")#打开表格

sheet1=wb['进项发票信息']

codeData={}#定义企业信息字典
3.遍历单元格并进行累加计算
for row in range(2,sheet1.max_row+1):#从第二行开始读取数据
    code=sheet1['A'+str(row)].value #得到公司代码单元格
    jine=sheet1['E'+str(row)].value #得到金额单元格
    fapiao=sheet1['H'+str(row)].value#发票


#确定code存在 企业编号
    codeData.setdefault(code,{'jine':0,'num':0,'youxiao':0})#每个code为一类,定义初始状态
    codeData[code]['num'] +=1
    codeData[code]['jine'] += float(jine)
    if fapiao=="有效发票":
        codeData[code]['youxiao'] += 1

上述首先遍历所有行,得到公司代码,金额,发票单元格信息。

使用codeData.setdefault进行初始定义。这样的好处是,遍历过程中会自动对为存在的企业进行建项,已存在的企业便跳过初始化步骤。

初始化完毕后,对num项进行数量累加,对金额项进行数值累加,对发票项进行条件累加。

最终,查看codeData:

在这里插入图片描述

codeData为一个字典,字典中包括公司代码"E1".“E2”…… 公司代码下又下辖金额jine,数量num,有效发票数量youxiao。

得到字典的保存与写入等更多操作,敬请期待……

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值