ExcelFile Vs. read_excel в pandas

Я погружаюсь в pandas и экспериментирую. Что касается чтения данных из файла Excel. Интересно, какая разница между использованием ExcelFile для read_excel. Оба, похоже, работают (хотя немного отличается от синтаксиса, как и следовало ожидать), и документация поддерживает оба. В обоих случаях документация описывает метод тот же: "Чтение таблицы Excel в DataFrame" и "Чтение таблицы Excel в pandas DataFrame". (документация для read_excel и для excel_file)

Я вижу ответы здесь на SO, который использует либо, без решения этой разницы. Кроме того, поиск Google не дал результата, который обсуждает эту проблему.

WRT мое тестирование, они кажутся эквивалентными:

path = "test/dummydata.xlsx"
xl = pd.ExcelFile(path)
df = xl.parse("dummydata")  # sheet name

и

path = "test/dummydata.xlsx" 
df = pd.io.excel.read_excel(path, sheetname=0)

кроме того, что последний сохраняет мне строку, есть ли разница между ними, и есть ли причина использовать один из них?

Спасибо!

Ответ 1

Там нет особой разницы, кроме синтаксиса. Технически ExcelFile - это класс, а read_excel - это функция. В любом случае фактический анализ обрабатывается методом _parse_excel определенным в ExcelFile.

В более ранних версиях панд read_excel полностью состоял из одного утверждения (кроме комментариев):

return ExcelFile(path_or_buf,kind=kind).parse(sheetname=sheetname,
                                              kind=kind, **kwds)

И ExcelFile.parse не сделал намного больше, чем вызов ExcelFile._parse_excel.

В последних версиях pandas read_excel гарантирует, что у него есть объект ExcelFile (и создает его, если его нет), а затем напрямую _parse_excel метод _parse_excel:

if not isinstance(io, ExcelFile):
    io = ExcelFile(io, engine=engine)

return io._parse_excel(...)

и с обновленной (и унифицированной) обработкой параметров ExcelFile.parse действительно является единственным утверждением:

return self._parse_excel(...)

Вот почему документы для ExcelFile.parse теперь говорят

Эквивалент read_excel (ExcelFile,...). См. Строку документации read_excel для получения дополнительной информации о принятых параметрах.

Что касается другого ответа, в котором утверждается, что ExcelFile.parse быстрее в цикле, то на самом деле все сводится к тому, создаете ли вы объект ExcelFile с нуля каждый раз. Конечно, вы можете создать свой ExcelFile один раз вне цикла и передать его в read_excel внутри цикла:

xl = pd.ExcelFile(path)
for name in xl.sheet_names:
    df = pd.read_excel(xl, name)

Это было бы эквивалентно

xl = pd.ExcelFile(path)
for name in xl.sheet_names:
    df = xl.parse(name)

Если ваш цикл включает в себя разные пути (другими словами, вы читаете много разных книг, а не просто несколько листов в одной книге), то вы все равно не сможете обойтись без создания нового экземпляра ExcelFile для каждого пути, и затем еще раз, и ExcelFile.parse и read_excel будут эквивалентны (и одинаково медленно).

Ответ 2

ExcelFile.parse выполняется быстрее.

Предположим, что вы читаете данные в цикле. С помощью ExcelFile.parse вы просто передаете объект Excelfile (xl в вашем случае). Таким образом, лист excel просто загружается один раз, и вы используете его для получения ваших данных. В случае Read_Excel вы передаете путь вместо объекта Excelfile. Таким образом, каждый раз, когда книга загружается снова. Делает беспорядок, если ваша книга имеет множество листов и десятки тысяч строк.

Ответ 3

Я полагаю, что Pandas первая реализация excel использовала двухэтапный процесс, но затем добавила одноэтапный процесс, называемый read_excel. Вероятно, оставил первый, потому что люди уже использовали его