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

168

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

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

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

Спасибо!

HaPsantran
источник
Посмотреть этот stackoverflow.com/a/61267822/6117565
Бикрам

Ответы:

247

Попробуй 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}словаря.

Ной
источник
4
FWIW, похоже (в последний раз, когда я тестировал это), первая строка загружается во все , поэтому нет способа эффективно вытянуть только один лист, но, по крайней мере, получение нескольких листов не требует многократной загрузки всего листа.
HaPsantran
1
Этот ответ был осужден пандами и теперь вылетает для меня в v0.21.0. Его следует заменить на тот, который дан @ Mat0kan.
DStauffman
1
@DStauffman Это все еще хорошо работает для меня, и я не вижу никаких признаков из кода или документов, что это устарело. Если у вас возникли проблемы с этим, я бы отправил вопрос на github для панд или xlrd (библиотека синтаксического анализа python excel, используемая пандами)
Noah
@ Нет, спасибо, я посмотрел на это еще немного, и ты прав, он все еще работает, пока я использую, sheet_nameи нет sheetname. Я не осознавал, что это устаревшая часть, потому что она все еще работала с методом read_excel, но не с методом parse.
DStauffman
@ Нет, действительно хороший ответ. Есть ли способ найти активную ячейку в листе Excel, который вы прочитали?
Ишвар
97

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

Читайте все листы прямо в упорядоченный словарь.

import pandas as pd

# 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)

Спасибо @ihightower за указание на это и @toto_tico за указание на проблему с версией.

Прочитайте первый лист непосредственно в dataframe

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

Прочитайте файл Excel и получите список листов. Затем выберите и загрузите листы.

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)

Обновление: Спасибо @toto_tico за указание на проблему с версией.

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

Викаш Сингх
источник
12
в последних пандах, которые у меня есть (0.20.3), чтобы прочитать все листы на карте ... все, что требуется df_sheet_map = pd.read_excel(file_fullpath, sheetname=None), это автоматически иметь листы в словаре ... и получить доступ к листу в виде информационного df_sheet_map['house']
кадра,
32

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

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

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

sheet2 = xls.parse(1)
Elliott
источник
7
Если вам нужен список имен листов, просто наберите xls.sheet_names
Stefano Fedele
28

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

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

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

Mat0kan
источник
9
pd.read_excel('filename.xlsx') 

по умолчанию читайте первый лист рабочей книги.

pd.read_excel('filename.xlsx', sheet_name = 'sheetname') 

прочитать конкретный лист рабочей тетради и

pd.read_excel('filename.xlsx', sheet_name = None) 

читать все рабочие листы от Excel до pandas, так как тип данных OrderedDict означает вложенные кадры данных, все рабочие листы как кадры данных, собранные внутри данных, и его тип - OrderedDict.

Ashu007
источник
1

Да, к сожалению, он всегда будет загружать полный файл. Если вы делаете это неоднократно, вероятно, лучше всего извлечь листы в отдельные CSV, а затем загрузить отдельно. Вы можете автоматизировать этот процесс с помощью d6tstack, который также добавляет дополнительные функции, такие как проверка, равны ли все столбцы на всех листах или в нескольких файлах Excel.

import d6tstack
c = d6tstack.convert_xls.XLStoCSVMultiSheet('multisheet.xlsx')
c.convert_all() # ['multisheet-Sheet1.csv','multisheet-Sheet2.csv']

Смотрите примеры d6tstack Excel

citynorman
источник
0

Если вы сохранили файл Excel в той же папке, что и ваша программа на Python (относительная адресация), тогда вам просто нужно указать номер листа вместе с именем файла. Синтаксис = pd.read_excel (Filename, SheetNo) Пример:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
Никита Агарвала
источник