У меня есть 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 и получить список листов внутри него, затем загрузить листы и добавить все листы. Циклирование кажется не очень эффективным, особенно когда увеличение размера данных для каждого добавления.
Используйте 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)
1092.280
и 912.008
секунд. Ваше второе решение кажется более эффективным :) Спасибо!
pd.read_excel(f, sheet_name=None)
не будет работать, правильный подход должен быть pd.read_excel(f, sheetname=None)
. Нет подчеркивания для имени листа
Если я правильно понимаю вашу проблему, установите 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)
if x.endswith(".xlsx") or x.endswith(".xls")
на if "Sales transaction" in x
. И я пытался работать с реальным набором данных (12 файлов Excel состоят из 65 листов в общей сложности и около 4 миллионов строк записей), общее время выполнения составляет 1040.364
секунды. :)