Python эффективный способ добавить все рабочие листы в нескольких Excel в панде dataframe

1

У меня есть 20++ xlsx файлы, внутри каждого xlsx файлы могут содержать разное количество рабочих листов. Но, слава богу, все столбцы - некоторые во всех таблицах и во всех файлах xlsx. Ссылаясь на здесь ", я получил некоторую идею. Я пытался несколько способов импортировать и добавлять все файлы Excel (все рабочие таблицы) в один фрейм данных (около 4 миллионов строк записей).

Примечание: я также проверил здесь ", но он включает в себя только уровень файла, мой файл consits и вплоть до уровня листа.

Я пробовал ниже код

# import all necessary package
import pandas as pd
from pathlib import Path
import glob
import sys

# set source path
source_dataset_path = "C:/Users/aaa/Desktop/Sample_dataset/"
source_dataset_list = glob.iglob(source_dataset_path + "Sales transaction *")

for file in source_dataset_list:
#xls = pd.ExcelFile(source_dataset_list[i])
    sys.stdout.write(str(file))
    sys.stdout.flush()
    xls = pd.ExcelFile(file)
    out_df = pd.DataFrame() ## create empty output dataframe

    for sheet in xls.sheet_names:
        sys.stdout.write(str(sheet))
        sys.stdout.flush() ## # View the excel files sheet names
        #df = pd.read_excel(source_dataset_list[i], sheet_name=sheet)
        df = pd.read_excel(file, sheetname=sheet)
        out_df = out_df.append(df)  ## This will append rows of one dataframe to another(just like your expected output)

Вопрос:

Мой подход такой, как сначала прочитать каждый файл Excel и получить список листов внутри него, затем загрузить листы и добавить все листы. Циклирование кажется не очень эффективным, особенно когда увеличение размера данных для каждого добавления.

Есть ли другой эффективный способ импортировать и добавлять все листы из нескольких файлов Excel?

  • 0
    Привет, @run-out run-out, спасибо за комментарий, я проверил ссылку, и я прочитал ее раньше, она только добавляется до уровня файла, но не до уровня листа.
Теги:
pandas
dataframe
excel

2 ответа

2
Лучший ответ

Используйте sheet_name=None в read_excel для обратного порядка заказов DataFrames, созданных из всех имен листов, затем соедините вместе concat и последний DataFrame.append с окончательным DataFrame:

out_df = pd.DataFrame()
for f in source_dataset_list:
    df = pd.read_excel(f, sheet_name=None)
    cdf = pd.concat(df.values())
    out_df = out_df.append(cdf,ignore_index=True)

Другое решение:

cdf = [pd.read_excel(excel_names, sheet_name=None).values() 
            for excel_names in source_dataset_list]

out_df = pd.concat([pd.concat(x) for x in cdf], ignore_index=True)
  • 1
    Привет @jezrael, спасибо за комментарий, я попытался использовать реальный набор данных (12 файлов Excel состоит из 65 листов в общей сложности). Время выполнения для обоих кодов составляет 1092.280 и 912.008 секунд. Ваше второе решение кажется более эффективным :) Спасибо!
  • 1
    и я обнаружил, что pd.read_excel(f, sheet_name=None) не будет работать, правильный подход должен быть pd.read_excel(f, sheetname=None) . Нет подчеркивания для имени листа
Показать ещё 2 комментария
1

Если я правильно понимаю вашу проблему, установите sheet_name=None в pd.read_excel.

import os
import pandas as pd

path = "C:/Users/aaa/Desktop/Sample_dataset/"

dfs = [
    pd.concat(pd.read_excel(path + x, sheet_name=None))
    for x in os.listdir(path)
    if x.endswith(".xlsx") or x.endswith(".xls")
]

df = pd.concat(dfs)
  • 0
    Привет @pythonjokeun, спасибо за комментарий, я попытался отредактировать твой код, чтобы соответствовать моему случаю, изменил if x.endswith(".xlsx") or x.endswith(".xls") на if "Sales transaction" in x . И я пытался работать с реальным набором данных (12 файлов Excel состоят из 65 листов в общей сложности и около 4 миллионов строк записей), общее время выполнения составляет 1040.364 секунды. :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню