我有一个很大的Excel文件,我只想加载前100行。熊猫似乎做得不好,因为在以下命令中加载大约需要10秒钟:
pd.read_excel('excel/BigFile.xlsx', nrows=100)
似乎花费的时间与根本没有通过nrows
参数相同。有没有一种方法可以“快速”读取excel文件的前100行?如果不在大熊猫中,还有其他工具可以做到这一点吗?
答案 0 :(得分:2)
pandas
在后台使用xlrd
包来读取excel文件。 xlrd
的默认行为似乎是将整个excel工作簿加载到内存中,而不管最后读取了什么数据。这可以解释为什么您在使用pd.read_excel()
的nrows
参数时没有注意到加载时间的减少。
xlrd
确实为load worksheets on demand提供了可能性,但是不幸的是,如果您的所有数据都在一个非常大的excel工作表中,那将无济于事(此外,似乎该选项没有不支持.xlsx
文件)。
excel解析包openpyxl
确实为load individual excel rows on demand提供了可能性(即,仅将所需的excel行加载到内存中)。只需一点定制代码,就可以利用openpyxl
来将您的Excel数据作为pandas数据框进行检索:
import openpyxl
import pandas as pd
def read_excel(filename, nrows):
"""Read out a subset of rows from the first worksheet of an excel workbook.
This function will not load more excel rows than necessary into memory, and is
therefore well suited for very large excel files.
Parameters
----------
filename : str or file-like object
Path to excel file.
nrows : int
Number of rows to parse (starting at the top).
Returns
-------
pd.DataFrame
Column labels are constructed from the first row of the excel worksheet.
"""
# Parameter `read_only=True` leads to excel rows only being loaded as-needed
book = openpyxl.load_workbook(filename=filename, read_only=True, data_only=True)
first_sheet = book.worksheets[0]
rows_generator = first_sheet.values
header_row = next(rows_generator)
data_rows = [row for (_, row) in zip(range(nrows - 1), rows_generator)]
return pd.DataFrame(data_rows, columns=header_row)
# USAGE EXAMPLE
dframe = read_excel('very_large_workbook.xlsx', nrows=100)
在我的计算机上,使用此代码加载> 100MB单页excel工作簿的前100行仅需1秒,而对pd.read_excel(nrows=100)
进行此操作需要2分钟以上。
答案 1 :(得分:2)
为此专门创建了sxl模块。要获取工作表的前100行:
import sxl
wb = sxl.Workbook('myfile.xlsx')
ws = wb.sheets[1] # this gets the first sheet
data = ws.head(100)