pyt*_*eer 8 python xlrd pandas openpyxl dask
我想处理一个 200MB 的 Excel (xlsx) 大文件,其中包含 15 个工作表和 100 万行,每行 5 列)并从数据创建一个 Pandas 数据框。Excel 文件的导入极其缓慢(最多 10 分钟)。不幸的是,Excel 导入文件格式是强制性的(我知道 csv 更快......)。
如何加快将大型 Excel 文件导入 Pandas 数据帧的过程?如果可能的话,将时间缩短到大约 1-2 分钟会很棒,这会更容易忍受。
到目前为止我尝试过的:
选项 1 - Pandas I/O read_excel
%%timeit -r 1
import pandas as pd
import datetime
xlsx_file = pd.ExcelFile("Data.xlsx")
list_sheets = []
for sheet in xlsx_file.sheet_names:
list_sheets.append(xlsx_file.parse(sheet, header = 0, dtype={
"Sales": float,
"Client": str,
"Location": str,
"Country": str,
"Date": datetime.datetime
}).fillna(0))
output_dataframe = pd.concat(list_sheets)
10min 44s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
Run Code Online (Sandbox Code Playgroud)
选项 2 - Dask
%%timeit -r 1
import pandas as pd
import dask
import dask.dataframe as dd
from dask.delayed import delayed
excel_file = "Data.xlsx"
parts = dask.delayed(pd.read_excel)(excel_file, sheet_name=0)
output_dataframe = dd.from_delayed(parts)
10min 12s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
Run Code Online (Sandbox Code Playgroud)
选项 3 - openpyxl 和 csv
仅从 Excel 工作簿创建单独的 csv 文件就花了大约 10 分钟,然后甚至通过以下方式将 csv 文件导入到 Pandas 数据框 read_csv
%%timeit -r 1
import openpyxl
import csv
from openpyxl import load_workbook
wb = load_workbook(filename = "Data.xlsx", read_only=True)
list_ws = wb.sheetnames
nws = len(wb.sheetnames) #number of worksheets in workbook
# create seperate csv files from each worksheet (15 in total)
for i in range(0, nws):
ws = wb[list_ws[i]]
with open("output/%s.csv" %(list_ws[i].replace(" ","")), "w", newline="") as f:
c = csv.writer(f)
for r in ws.rows:
c.writerow([cell.value for cell in r])
9min 31s ± 0 ns per loop (mean ± std. dev. of 1 run, 1 loop each)
Run Code Online (Sandbox Code Playgroud)
我在一台机器上使用 Python 3.7.3(64 位)(Windows 10),16GB RAM,8 核(i7-8650U CPU @ 1.90GHz)。我在我的 IDE (Visual Studio Code) 中运行代码。
压缩不是瓶颈,问题在于解析 XML 并在 Python 中创建新的数据结构。从您引用的速度来看,我假设这些文件非常大:有关更多详细信息,请参阅文档中有关性能的说明。xlrd 和 openpyxl 的运行都接近底层 Python 和 C 库的限制。
从 openpyxl 2.6 开始,您可以选择values_only读取单元格,这会加快速度。您还可以使用具有只读模式的多个进程来并行读取工作表,如果您有多个处理器,这应该会加快速度。
| 归档时间: |
|
| 查看次数: |
6997 次 |
| 最近记录: |