大家好,我是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】:请问具体是什么版本啊

下图是对应的库:

# yyds干货盘点 # 需求是统计excel表格每个sheet的行数,请问还有更快捷的方法么?_Python

【wen】:谢谢,刚刚也搜到这个库

【郑煜哲·Xiaopang】:就4秒没意义啊,启动新线程也会有开销,不如果你真的对这个有追求,要不先考虑把东西转移到内存,从内存读取,肯定比硬盘io那么多次性能好,如果测试是csv,速度会快很多很多,不如上游生产的时候,就改造成csv输出。

【wen】:我要把数百个不同的表格合并成格式统一的单一表格,合并后要进行检验,提取每一个原始表格的行数与合并表格行数进行对比,校验环节花费比较多时间,以前只用pandas的默认引擎。目前方案是使用calamine引擎,加快速度,不需要大幅修改代码。

【隔壁😼山楂】:或者说边合并边校验行数,又可以少一步读取表格。

# yyds干货盘点 # 需求是统计excel表格每个sheet的行数,请问还有更快捷的方法么?_Python_02

顺利地解决了自己的问题。

如果你也有类似这种Python相关的小问题,欢迎随时来交流群学习交流哦,有问必答!

三、总结

大家好,我是Python进阶者。这篇文章主要盘点了一个pandas数据处理的问题,文中针对该问题,给出了具体的解析和代码实现,帮助粉丝顺利解决了问题。

最后感谢粉丝【wen】提出的问题,感谢【隔壁😼山楂】、【平庸】、【沈复】、【郑煜哲·Xiaopang】给出的思路,感谢【莫生气】等人参与学习交流。

【提问补充】温馨提示,大家在群里提问的时候。可以注意下面几点:如果涉及到大文件数据,可以数据脱敏后,发点demo数据来(小文件的意思),然后贴点代码(可以复制的那种),记得发报错截图(截全)。代码不多的话,直接发代码文字即可,代码超过50行这样的话,发个.py文件就行。