如何在pandas中使用read_excel来提高处理速度?

时间:2018-06-05 08:39:57

标签: python excel python-3.x pandas dataframe

我需要使用 pd.read_excel 来处理一个excel文件中的每个工作表。
但在大多数情况下,我不知道工作表名称 所以我用它来判断excel中有多少张:

i_sheet_count=0
i=0
try:
  df.read_excel('/tmp/1.xlsx',sheetname=i)
  i_sheet_count+=1
  i+=1
else:
  i+=1
print(i_sheet_count)

在这个过程中,我发现这个过程很慢,
那么, read_excel 只能读取有限的行来提高速度吗? 我试过 nrows 但是没有工作..还慢......

2 个答案:

答案 0 :(得分:4)

在不猜测

的情况下阅读所有工作表

sheetname = None使用pd.read_excel参数。这会将所有工作表读入数据帧字典。例如:

dfs = pd.read_excel('file.xlsx', sheetname=None)

# access 'Sheet1' worksheet
res = dfs['Sheet1']

限制行数或列数

您可以使用parse_colsskip_footer参数来限制列数和/或行数。这会缩短阅读时间,也适用于sheetname = None

例如,以下内容将读取前3列,如果您的工作表有100行,则只读取前20行。

df = pd.read_excel('file.xlsx', sheetname=None, parse_cols='A:C', skip_footer=80)

如果您希望应用特定于工作表的逻辑,可以通过提取工作表名称来实现:

sheet_names = pd.ExcelFile('file.xlsx', on_demand=True).sheet_names

dfs = {}
for sheet in sheet_names:
    dfs[sheet] = pd.read_excel('file.xlsx', sheet)

提高绩效

将Excel文件读入Pandas自然比其他选项(CSV,Pickle,HDF5)慢。如果您希望提高性能,我强烈建议您考虑这些其他格式。

例如,一个选项是use a VBA script将Excel工作表转换为CSV文件;然后使用pd.read_csv

答案 1 :(得分:-2)

您好james

我现在遇到了熊猫vs Excel(而不是Excel上的熊猫 )。这是我的方法。

工作表名称

为了避免try的开销,我正在读取所有工作表名称:

import xlrd
xls = xlrd.open_workbook('file.xlsx', on_demand=True)
Labels = xls.sheet_names()

on_demand=True参数可确保在我绝对需要之前不会读取任何实际数据,这很好,因为这里只需要工作表名称列表即可。

读取的数据

输入pandas。我的问题是-我认为-比您的情况糟糕,因为我在每个工作表上都有多个数据Blob,并且我需要查明每个数据Blob,从而导致疯狂的循环和坐标查明,但是假设这是一个简化的(精明的)版本您的情况,您可以按照上面的方法做:

dfs = {}
for sheet in sheet_names:
    dfs[sheet] = pd.read_excel('file.xlsx', sheet)

实际上,看着jpp的工作表名称读取解决方案,我正在考虑借用它(imitation is the sincerest form of flattery)。我已经在做字典工作,以便将工作表名称保留在某个地方。

性能

最后,我该如何处理我觉得极其缓慢的体验?正如我所提到的,我的读取更为复杂,但是我的源文件只是一个并且没有变化。

牢记这一点,我要做的就是,一读完书,便将所有内容导出到csv。由于某些神秘的原因,我只能猜测与Microsoft这个名字有关,即使使用所有文本分析功能读取csv的速度也比xlsx快很多倍。

我的导出代码是这样:

if glob('*.csv') != CSVS:
    for label, csvlabel in zip(Labels, CSVS):
        print(f'Exporting {label} to {csvlabel}...')
        data[label].to_csv(csvlabel)

CSVScsv文件名的列表,基于工作表名称(但稍作过滤)。因此,从本质上讲,我正在测试上述csv的存在,但是您可以忽略if并继续覆盖它们。

关于VBA脚本,我希望您的心理医生能快速拨号。之后,您将需要吸毒或进行尸检。我真诚地希望选择/复制Excel数据Blob,然后将其粘贴到记事本中,或者只是pd.read_clipboard