我有一个非常大的 excel 文件,我只想加载前 100 行。看来pandas 做的不是很好,因为在下面的命令中加载大约需要10 秒:
pd.read_excel('excel/BigFile.xlsx', nrows=100)
Run Code Online (Sandbox Code Playgroud)
这似乎与根本不传入nrows参数所花费的时间相同。有没有办法“快速”读取excel文件的前100行?如果不是在熊猫中,是否有其他工具可以做得更好?
pandas使用xlrd引擎盖下的包来读取 excel 文件。的默认行为xlrd似乎是将整个 excel 工作簿加载到内存中,而不管最终读出什么数据。这可以解释为什么你当你使用注意到在加载时间没有减少nrows的参数pd.read_excel()。
xlrd确实提供了按需加载工作表的可能性,但不幸的是,如果您的所有数据都在一个非常大的 Excel 工作表中,这将没有多大帮助(而且似乎此选项不支持.xlsx文件)。
excel 解析包openpyxl确实提供了按需加载单个 excel 行的可能性(即,仅将所需的 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)
Run Code Online (Sandbox Code Playgroud)
使用此代码加载> 100MB 单页excel 工作簿的前100 行在我的机器上只需<1 秒,而在pd.read_excel(nrows=100)> 2分钟的情况下执行相同操作。
| 归档时间: |
|
| 查看次数: |
4689 次 |
| 最近记录: |