Использование 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 варианта:
- Прочитайте первый лист непосредственно в dataframe
- Прочтите файл excel и получите список листов. Затем выберите и загрузите листы.
- Прочитайте все листы и сохраните их в словаре.
Образец кода:
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")
будет загружать только лист "имя_папки"