有没有更快的方法将Excel文件读入Pandas数据框中?

4

我有大约700个Excel文件,需要通过删除一些标题并更改一些列名来将其转换为CSV文件。我已经实现了解决方案,但是速度很慢。我发现读取Excel到数据框架中需要很多时间,我使用的是如下所示的Pandas:

df = pd.read_excel(file_path, skiprows=self.skip_rows)

我猜有一些Unix命令可以快速执行此操作,但我想要一个Python的解决方案。是否有其他更快的库?此外,我想知道为什么读取Excel文件需要更长时间,如果我们想要保留来自Excel的样式和颜色,那么这应该需要更长时间。但在我的情况下,我只需要将其读入数据帧中。
以下是版本号:
- Python: 2.7.12 - Pandas: 0.21.0 - Xlrd: 1.0.0

1
你打算如何处理这些数据?大部分瓶颈在于解析数据。通过添加 dtype=object,通常可以看到一些速度提升,它不会对数据做出任何假设,应该更快。 - cs95
@cᴏʟᴅsᴘᴇᴇᴅ:在问题中,OP想要将其转换为CSV文件。 - Willem Van Onsem
@WillemVanOnsem,是的,他们还想要“删除一些标题并更改一些列名称”,因此我认为仅进行转换不是他们想要的。 - cs95
@COLDSPEED: 只是想澄清一下,我想跳过一些行,更改一些列名,并将其保存为CSV文件。我会进行进一步处理(多次),但它们将在CSV文件上完成,因为这样更快。 - Azhar
1个回答

1
我发现在Python中读取大型Excel工作簿时,pandas速度较慢。 Openpylx也可能很慢,但如果您只对从Excel工作表获取值感兴趣,则有一种显着更快的方法。

  1. 使用openpyxl以只读方式打开工作簿
  2. 获取所需的工作表
  3. 使用worksheet.values迭代器,使用islice仅提取您想要的范围。您可以传递列号或列ID字符串

这些函数将非常快地返回您指定的值范围。

from openpyxl import load_workbook
from copy import copy,deepcopy
from itertools import islice
import string

def col2num(col):
    num = 0
    for c in col:
        if c in string.ascii_letters:
            num = num * 26 + (ord(c.upper()) - ord('A')) + 1
    return num

def get_worksheet_range(ws, r_start=1,c_start=1,r_end=-1,c_end=-1):
    if isinstance(c_start,int)==False:
        c_start=col2num(c_start)
    if isinstance(c_end,int)==False:
        c_end=col2num(c_end)
    if r_end<=0: r_end=ws.max_row
    if c_end<=0: c_end=ws.max_row
    outrange=[x[:] for x in [[None] * (c_end-c_start+1)] * (r_end-r_start+1)]
    i=0
    for row in islice(ws.values,r_start-1,r_end):
        j=0
        for value in islice(row,c_start-1,c_end-1):
            outrange[i][j]=value;j=j+1
        i=i+1
    return outrange

wb=load_workbook(filename=r"c:\some_excel_file.xlsx",read_only=True) 
ws=wb['SomeWorkSheet']
datarange=get_worksheet_range(ws)

这段代码似乎对我无效。我只得到一个包含None值的列表,或者这在python3上无法工作吗? - Matthi9000
如果你想在以后对数据进行排序或操作,不要使用openpyxl,因为它不支持排序和许多其他功能! - greendino
我不确定这段代码是否有效,但我可以证明,使用load_workbook(..., read_only=True)可以比Pandas更快地处理xlsx文件。请参阅openpyxl文档:https://openpyxl.readthedocs.io/en/latest/optimized.html - ferreiradev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接