Python 帮同事用pandas快速筛选Excel文件

简介: Python 帮同事用pandas快速筛选Excel文件

同事正在为怎样处理一个18万行的全年财务Excel文件发愁,文件足足有30M,打开文件也要两三分钟,于是他就向我求助。大概意思就是要筛选出Data工作簿“源数据”Sheet中所有收款人对应的付款人及付款笔数、金额小计,于是我简化做了一个表格,只有4个涉及到的列,随机数据200行用于测试。其实我也没好好学过pandas库的用法,只能边写代码边查库函数方法的帮助。


读者想测试的话把以下表格建一个Data.xlsx文件,放入工作表sheet改名为“源数据”:


image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png



程序执行后,输出的output.xlsx文件格式:

image.pngimage.pngimage.png

image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png



源代码20行(其中有6行是测试用时的代码可以去除)如下:

import time, pandas as pd
def tprint(info): print(info); return time.time()
t1 = tprint('正在读取数据,请稍候...')
df = pd.read_excel('data.xlsx', sheet_name='源数据')
t2 = tprint('正在数据计算,请稍候...')
ls, label = [], ('付款人','收款人','摘要','金额','笔数','总笔数','全部摘要')
for 收款人 in df.收款人.unique():
    付款人 = df[df.收款人==收款人].付款人
    总笔数 = 付款人.shape[0]
    for 付款人 in 付款人.unique():
        数集 = df[(df.收款人==收款人) & (df.付款人==付款人)].fillna('空值')
        笔数, 金额 = 数集.shape[0], 数集.金额.sum().round(2)
        摘要,全部摘要 = 数集.摘要.iloc()[0], "、".join(数集.摘要.unique())
        ls.append('~'.join(map(str,(eval(_) for _ in label))).split("~"))
data = pd.DataFrame(ls, columns=label).sort_values(by='收款人')
data.金额, data.笔数, data.总笔数 = data.金额.astype('float'),data.笔数.astype('int'),data.总笔数.astype('int')
t3 = tprint('正在写入文件,请稍候...')
data.to_excel('output1.xlsx', sheet_name='Sheet1',index=False)
t4 = time.time()
print(f'读取耗时:{t2-t1:.3f}s\n计算耗时:{t3-t2:.3f}s\n写入耗时:{t4-t3:.3f}s\n共计耗时:{t4-t1:.3f}s')



测试效果:


   正在读取数据,请稍候...

   正在数据计算,请稍候...

   正在写入文件,请稍候...

   读取耗时:0.859s

   计算耗时:0.314s

   写入耗时:0.063s

   共计耗时:1.236s


处理那个30M的文件时,因为列名一样,都不用改代码。实测读取用了58秒,计算用1600秒,共计用时28分钟左右,完美完成筛选任务。


边学边写的代码,可能就根本没用到pandas的精华所在。但也谈谈代码中几个注意点:


1. python 支持中文名变量,直接用列名作变量有好处,省得注释以及想很多变量名称来命名。


2. DataFrame筛选条件的逻辑运算用 & | ,其运算级别高于“大于”“小于”“等于”等,所以括号不能省。如代码中的: df[(df.收款人==收款人) & (df.付款人==付款人)]


3. 取DataFrame的列,可以用 df['收款人'] 也能用 df.收款人,我觉得用后者更方便点。


4. 源数据“摘要”列中有空单元格,读入DataFrame中后其值为nan,这个起先没注意到代码一直报错。后查询到df有.fillna()方法可以替换掉空值。


5. 求行数可以直接用len(df)求,也可用df.shape()方法返回一个元组:(行数、列数)。


6. 行数据我用了一句代码 '~'.join(map(str,(eval(_) for _ in label))).split("~") 合并后分割成列表。意思是从元组中取数eval转成变量,再把当层循环的变量值转字符型合并最后分割,字符“~”任意取其它字符来替代,但不能在数据中出现过否则分割列数不正常。


7. 数值类型的列都要用.astype()转回相应的数值类型,否则得到的.xlsx文件中数值列都是文本型数字(Excel中表现为单元格左上角有绿色小三角),不便于统计合计数。如:

data.金额 = data.金额.astype('float')
   data.笔数 = data.笔数.astype('int')



8. df.unique()是去重方法,相当于用set()给列表去重;df.sort_values(by='',acending=True)是排序方法,升序或降序scending=True表示升序,ascending=False表示降序,默认为升序。


(本文完)


附pandas学习图一张:

c5b4ec8085ff4e11a7929de35d1852bf.png





目录
相关文章
|
11天前
|
机器学习/深度学习 存储 算法
解锁文件共享软件背后基于 Python 的二叉搜索树算法密码
文件共享软件在数字化时代扮演着连接全球用户、促进知识与数据交流的重要角色。二叉搜索树作为一种高效的数据结构,通过有序存储和快速检索文件,极大提升了文件共享平台的性能。它依据文件名或时间戳等关键属性排序,支持高效插入、删除和查找操作,显著优化用户体验。本文还展示了用Python实现的简单二叉搜索树代码,帮助理解其工作原理,并展望了该算法在分布式计算和机器学习领域的未来应用前景。
|
1天前
|
Python
python pandas学习(一)
该代码段展示了四个主要操作:1) 删除指定列名,如商品id;2) 使用正则表达式模糊匹配并删除列,例如匹配订单商品名称1的列;3) 将毫秒级时间戳转换为带有时区调整的日期时间格式,并增加8小时以适应本地时区;4) 将列表转换为DataFrame后保存为Excel文件,文件路径和名称根据变量拼接而成。
12 3
|
21天前
|
监控 网络安全 开发者
Python中的Paramiko与FTP文件夹及文件检测技巧
通过使用 Paramiko 和 FTP 库,开发者可以方便地检测远程服务器上的文件和文件夹是否存在。Paramiko 提供了通过 SSH 协议进行远程文件管理的能力,而 `ftplib` 则提供了通过 FTP 协议进行文件传输和管理的功能。通过理解和应用这些工具,您可以更加高效地管理和监控远程服务器上的文件系统。
51 20
|
27天前
|
存储 数据采集 数据处理
如何在Python中高效地读写大型文件?
大家好,我是V哥。上一篇介绍了Python文件读写操作,今天聊聊如何高效处理大型文件。主要方法包括:逐行读取、分块读取、内存映射(mmap)、pandas分块处理CSV、numpy处理二进制文件、itertools迭代处理及linecache逐行读取。这些方法能有效节省内存,提升效率。关注威哥爱编程,学习更多Python技巧。
|
28天前
|
存储 JSON 对象存储
如何使用 Python 进行文件读写操作?
大家好,我是V哥。本文介绍Python中文件读写操作的方法,包括文件读取、写入、追加、二进制模式、JSON、CSV和Pandas模块的使用,以及对象序列化与反序列化。通过这些方法,你可以根据不同的文件类型和需求,灵活选择合适的方式进行操作。希望对正在学习Python的小伙伴们有所帮助。欢迎关注威哥爱编程,全栈路上我们并肩前行。
|
1月前
|
存储 数据挖掘 数据处理
Python Pandas入门:行与列快速上手与优化技巧
Pandas是Python中强大的数据分析库,广泛应用于数据科学和数据分析领域。本文为初学者介绍Pandas的基本操作,包括安装、创建DataFrame、行与列的操作及优化技巧。通过实例讲解如何选择、添加、删除行与列,并提供链式操作、向量化处理、索引优化等高效使用Pandas的建议,帮助用户在实际工作中更便捷地处理数据。
47 2
|
2月前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
305 10
|
4月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
260 4
|
2月前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
6月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
67 0

推荐镜像

更多