回复“书籍”即可获赠Python从入门到进阶共10本电子书
大家好,我是Python进阶者。
一、前言
前几天在Python最强王者交流群【wen】问了一个Pandas处理数据的问题,问题如下:
import pandas as pd
import polars as pl
import time
start_time = time.time()
df = pd.read_excel('G:\input\测试.xlsx', sheet_name=None, dtype=str,engine='calamine')
sheet_names = list(df.keys())
for sheet_name in sheet_names:
df_sheet = pl.read_excel('G:\input\测试.xlsx', sheet_name=sheet_name)
print(f'{sheet_name}----------{df_sheet.height}')
end_time = time.time()
time_taken = end_time - start_time
请教,需求是统计excel表格每个sheet的行数,请问还有更快捷的方法么?
之前没使用calamine引擎,13万行数据大概需要50秒,使用calamine压缩到10秒
二、实现过程
后来【隔壁😼山楂】给了一些建议如下:为什么需要read两边呢
【wen】:第一次提取sheet的名字
【隔壁😼山楂】:第一次的时候已经把表全部提取出来了。如果只想提取名字,应该限制行数。
【平庸】:可以不用的,sheet name=none ,然后读取出来的就是整个表格,再循环就能取到每个表了,没必要搞两个循环
【wen】:那代码怎么设置啊,我是再for循环一次?我测试 polars的速读最快 25万条数据 大概4秒搞定
【隔壁😼山楂】:你只写df = pd.read_excel('G:\input\测试.xlsx', sheet_name=None, dtype=str,engine='calamine') 多久
【wen】:
df = pd.read_excel('G:\input\测试.xlsx', sheet_name=None, dtype=str,engine='calamine')
for sheet_name,dataframe in df.items():
print(f'{sheet_name}-----------{dataframe.shape[0]}')
end_time = time.time()
time_taken = end_time - start_time
print(f'calamine----{time_taken}')
现在压缩到5秒,确实重复读取两次浪费太多时间。5秒,不用calamine殷勤大概25秒。
【平庸】不要dtype 是慢点还是快点?然后shape换成info 是慢点还是快点
【wen】:我试试。Pandas只使用一个cpu核 太慢了
【平庸】:是的咯
【wen】:Polars最快,但是要修改很多代码,我觉得目前最快捷就是加上calamine引擎。也尝试使用modin 但是速度和没有pandas一样 可能是我设置的问题。
【隔壁😼山楂】:主要是excel不好读,换成其他的就快很多
【沈复】:有高并发,多核的版本。
【wen】:请问具体是什么版本啊
下图是对应的库:
【wen】:谢谢,刚刚也搜到这个库
【郑煜哲·Xiaopang】:就4秒没意义啊,启动新线程也会有开销,不如果你真的对这个有追求,要不先考虑把东西转移到内存,从内存读取,肯定比硬盘io那么多次性能好,如果测试是csv,速度会快很多很多,不如上游生产的时候,就改造成csv输出。
【wen】:我要把数百个不同的表格合并成格式统一的单一表格,合并后要进行检验,提取每一个原始表格的行数与合并表格行数进行对比,校验环节花费比较多时间,以前只用pandas的默认引擎。目前方案是使用calamine引擎,加快速度,不需要大幅修改代码。
【隔壁😼山楂】:或者说边合并边校验行数,又可以少一步读取表格。
顺利地解决了自己的问题。
如果你也有类似这种Python相关的小问题,欢迎随时来交流群学习交流哦,有问必答!
三、总结
大家好,我是Python进阶者。这篇文章主要盘点了一个pandas数据处理的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。
最后感谢粉丝【wen】提出的问题,感谢【隔壁😼山楂】、【平庸】、【沈复】、【郑煜哲·Xiaopang】给出的思路,感谢【莫生气】等人参与学习交流。
【提问补充】温馨提示,大家在群里提问的时候。可以注意下面几点:如果涉及到大文件数据,可以数据脱敏后,发点demo数据来(小文件的意思),然后贴点代码(可以复制的那种),记得发报错截图(截全)。代码不多的话,直接发代码文字即可,代码超过50行这样的话,发个.py文件就行。
大家在学习过程中如果有遇到问题,欢迎随时联系我解决(我的微信:pdcfighting1),应粉丝要求,我创建了一些高质量的Python付费学习交流群和付费接单群,欢迎大家加入我的Python学习交流群和接单群!
小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。
------------------- End -------------------
往期精彩文章推荐:
欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
想加入Python学习群请在后台回复【入群】
万水千山总是情,点个【在看】行不行
/今日留言主题/
随便说一两句吧~~