Ускорить объединение файлов Excel с помощью Pandas

Я пытаюсь объединить несколько файлов excel с pandas, используя следующий код:

import pandas as pd from os.path import basename df = [] for f in ['test1.xlsx', 'test2.xlsx']: data = pd.read_excel(f, 'Sheet1') data.index = [basename(f)] * len(data) df.append(data) df = pd.concat(df) df.to_excel("merged_data2.xlsx") 

Что отлично работает в тестовых файлах, но при попытке использовать 3 других файла excel размером более 100 мб каждый процесс становится слишком медленным, чтобы быть полезным. Я видел этот другой пост на тему: Почему конкатенация DataFrames экспоненциально медленнее?

И я считаю, что я правильно следил за советом по использованию списка перед конкатенацией, но без успеха. Есть идеи? Благодарю.

Я не вижу ничего плохого в вашем коде pandas; файл 300mb excel может быть очень полезен для Pandas! Вот несколько подходов, которые я возьму:

Тактика 1. Исследуйте

Если бы я был вами, моим следующим шагом в отладке было бы бросить в цикл какие-либо инструкции print(datetime.now()) , чтобы увидеть, что это время чтения, конкатенация или .to_excel . Таким образом, вы сможете сузить проблему. Также обратите внимание на использование вашей памяти с помощью соответствующих инструментов для любой ОС, в которой вы находитесь.

Тактика 2. Попробуйте другой инструмент

Pandas оптимизирован для научных вычислений, и, вероятно, он тратит довольно много времени на организацию данных для запросов и т. Д. ETL не является основной целью. Если вам нужно всего лишь конкатенировать несколько листов (насколько мне больно предлагать сделать что-то вручную!), Ручная работа в самом Excel, скорее всего, будет самым быстрым способом – высокооплачиваемым инженерам в Microsoft было поручено оптимизировать это , Если вам нужен программный подход, может быть стоит попробовать пэлл или один из инструментов, обсуждаемых здесь, что может потребовать более простой / более эффективный подход, чем панды.

Например, petl кода petl который может сделать трюк:

 import petl petl.cat(* petl.io.fromxlsx(file) for file in ['your.xlsx', 'excel.xlsx', 'files.xlsx'] ).progress().toxlsx() 
  • Медленный vlookup и countifs
  • Оптимизированный способ добавления нескольких гиперссылок в файл excel с помощью C #
  • Список всех объектов проверки в листе с помощью Excel Interop без повторения каждой ячейки
  • Проблемы с производительностью Excel VBA, сравнивающие удаление строк и столбцов
  • Ускорение кода, который просто заполняет ячейки строками
  • Тест нагрузки VSTS - отчет о Excel - добавлен метод класса рабочей книги
  • Excel vba: разница в производительности функции между вызовом вручную ('=') или с помощью макросов
  • Код VBA - пропустите некоторые части, если некоторые другие будут исключены
  • Производительность Excel - комбинация INDEX-MATCH
  • VBA / Excel ускорить добавление макросов
  • Запуск макроса медленной формулы
  • Давайте будем гением компьютера.