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


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

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

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

спасибо!

4 52

4 ответа:

попробовать pd.ExcelFile:

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

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

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

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

есть 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 за указание на это.

sheetname: string, int, смешанный список строк/ints или нет, по умолчанию 0 Устаревшим, начиная с версии 0.21.0: вместо того, чтобы использовать sheet_name Ссылка На Источник

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

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

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

sheet2 = xls.parse(1)

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

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

будет загружать только лист "sheet_name"