Использование Pandas в pd.read_excel() для нескольких листов одной и той же книги

У меня есть файл большой таблицы (.xlsx), который обрабатывается с помощью python pandas. Бывает, что мне нужны данные из двух вкладок в этом большом файле. На одной из вкладок имеется тонна данных, а другая - всего несколько квадратных ячеек.

Когда я использую pd.read_excel() на любом рабочем листе, мне кажется, что весь файл загружен (а не только рабочий лист, который меня интересует), Поэтому, когда я использую этот метод дважды (один раз для каждого листа), мне действительно приходится переносить всю прочитанную книгу дважды (хотя мы используем только указанный лист).

Я использую это неправильно или это просто ограничено таким образом?

Спасибо!

Ответ 1

Попробуйте pd.ExcelFile:

xls = pd.ExcelFile('path_to_file.xls')
df1 = pd.read_excel(xls, 'Sheet1')
df2 = pd.read_excel(xls, 'Sheet2')

Как отмечено @HaPsantran, весь Excel файл читается во время ExcelFile() (похоже, это не так). Это просто избавляет вас от необходимости читать один и тот же файл каждый раз, когда вы хотите получить доступ к новому листу.

Обратите внимание, что аргумент sheet_name для pd.read_excel() может быть именем листа (как указано выше), целым числом, определяющим номер листа (например, 0, 1 и т.д.), Список имен листов или индексов или None. Если список предоставлен, он возвращает словарь, где ключи - это имена/индексы листа, а значения - это кадры данных. По умолчанию используется просто возврат первого листа (т. sheet_name=0).

Если указано None, все листы возвращаются, как словарь {sheet_name:dataframe}.

Ответ 2

Есть 3 варианта:

  1. Прочитайте первый лист непосредственно в dataframe
  2. Прочтите файл excel и получите список листов. Затем выберите и загрузите листы.
  3. Прочитайте все листы и сохраните их в словаре.

Образец кода:

import pandas as pd

df = pd.read_excel('excel_file_path.xls')
# this will read the first sheet into df

xls = pd.ExcelFile('excel_file_path.xls')

# Now you can list all sheets in the file
xls.sheet_names
# ['house', 'house_extra', ...]

# to read just one sheet to dataframe:
df = pd.read_excel(file_name, sheetname="house")

# to read all sheets to a map
sheet_to_df_map = {}
for sheet_name in xls.sheet_names:
    sheet_to_df_map[sheet_name] = xls.parse(sheet_name)

Обновить:

# @ihightower pointed out in the comments that all sheets can be 
# directly read into an ordered dictionary in 1 step

# for pandas version >= 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheet_name=None)

# for pandas version < 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheetname=None)

Обновление 2: Спасибо @toto_tico за указание на это.

имя листа: строка, int, смешанный список строк /int или None, по умолчанию 0 Устаревший с версии 0.21.0: используйте имя листа вместо Source Link

Ответ 3

Вы также можете использовать индекс для листа:

xls = pd.ExcelFile('path_to_file.xls')
sheet1 = xls.parse(0)

даст первый рабочий лист. для второго листа:

sheet2 = xls.parse(1)

Ответ 4

Вы также можете указать имя листа в качестве параметра:

data_file = pd.read_excel('path_to_file.xls', sheetname="sheet_name")

будет загружать только лист "имя_папки"