как объединить несколько листов excel из одного файла?



У меня есть большой файл excel, который содержит много разных листов. Все листы имеют одинаковую структуру, например:

Name
col1  col2  col3  col4
1     1     2     4
4     3     2     1
  • Как я могу объединить (вертикально) все эти листы в Pandas, не называя каждый из них вручную? Если бы это были файлы, я мог бы использовать glob для получения списка файлов в каталоге. Но здесь, для листов excel, я потерялся.
  • Существует ли способ создать переменную в результирующем фрейме данных, которая идентифицирует имя листа, из которого поступают данные откуда?

Спасибо!

151   3  

3 ответов:

Попробуйте вот что:

dfs = pd.read_excel(filename, sheetname=None, skiprows=1)

Это вернет вам словарь DFs, который вы можете легко объединить с помощью pd.concat(dfs) или как @jezrael уже опубликовал в своем ответе:

df = pd.concat(pd.read_excel(filename, sheetname=None, skiprows=1))

Sheetname : None - > все листы как словарь фреймов данных

Обновление:

Существует ли способ создать переменную в результирующем фрейме данных, которая определяет имя листа, из которого поступают данные?

dfs = pd.read_excel(filename, sheetname=None, skiprows=1)

Предположим, что мы имеем следующее дикт:

In [76]: dfs
Out[76]:
{'d1':    col1  col2  col3  col4
 0     1     1     2     4
 1     4     3     2     1, 'd2':    col1  col2  col3  col4
 0     3     3     4     6
 1     6     5     4     3}

Теперь мы можем добавить новый столбец:

In [77]: pd.concat([df.assign(name=n) for n,df in dfs.items()])
Out[77]:
   col1  col2  col3  col4 name
0     1     1     2     4   d1
1     4     3     2     1   d1
0     3     3     4     6   d2
1     6     5     4     3   d2

Сначала добавьте параметр sheetname=None для dict из DataFrames и skiprows=1 для опустить первую строку, а затем используйте concat для MultiIndex DataFrame.

Последнее использование reset_index для колонки с первого уровня:

df = pd.concat(pd.read_excel('multiple_sheets.xlsx', sheetname=None, skiprows=1))
df = df.reset_index(level=1, drop=True).rename_axis('filenames').reset_index()

Принимая во внимание этот вопрос :

import pandas as pd

file = pd.ExcelFile('file.xlsx')

names = file.sheet_names  # see all sheet names

df = pd.concat([file.parse(name) for name in names])

Результаты:

df
Out[6]: 
   A  B
0  1  3
1  2  4
0  5  6
1  7  8

Затем вы можете запустить df.reset_index(), чтобы, ну, сбросить индекс.

Править: pandas.ExcelFile.parse это, согласно документам панд:

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

    Ничего не найдено.

Добавить ответ:
Отменить.