Використання Pandas для pd.read_excel () для кількох робочих аркушів однієї робочої книги


166

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

Коли я використовую pd.read_excel () на будь-якому робочому аркуші, мені здається, що завантажений весь файл (не лише аркуш, який мене цікавить). Отже, коли я використовую метод двічі (один раз для кожного аркуша), я фактично мушу зазнати, що вся робоча книга читається двічі (навіть якщо ми використовуємо лише вказаний аркуш).

Я неправильно використовую це чи обмежений таким чином?

Дякую!


Відповіді:


244

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

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

Як зазначає @HaPsantran, під час ExcelFile()виклику зачитується весь файл Excel (схоже, це не обійдеться ). Це просто позбавляє вас від необхідності читати один і той же файл щоразу, коли ви хочете отримати доступ до нового аркуша.

Зауважте, що 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, але не над методом розбору.
DStauffman

@Noah Дійсно приємна відповідь. Чи є спосіб знайти активну комірку на листі 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 за вказівку на проблему версії.

Прочитайте перший аркуш безпосередньо в кадр даних

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 за вказівку на проблему з версією.

name аркуш: рядок, int, змішаний список рядків / ints, або None, за замовчуванням 0 Застаріло з версії 0.21.0: Використовуйте name_name name замість Source Source


12
в останніх пандах, які у мене є (0.20.3), щоб прочитати всі аркуші на карті .. все, що потрібно df_sheet_map = pd.read_excel(file_fullpath, sheetname=None), це буде мати аркуші в словнику автоматично .. і отримати доступ до аркуша як такий кадр даних:df_sheet_map['house']
ihightower

32

Ви також можете використовувати індекс для аркуша:

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

дасть перший робочий аркуш. для другого робочого аркуша:

sheet2 = xls.parse(1)

7
Якщо ви хочете переліку назв аркушів, то просто введіть xls.sheet_names
Стефано Феделе,

28

Ви також можете вказати назву аркуша як параметр:

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

буде завантажувати лише аркуш "sheet_name".


9
pd.read_excel('filename.xlsx') 

за замовчуванням прочитайте перший аркуш робочої книги.

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

прочитати конкретний аркуш робочої книги та

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

читати всі робочі аркуші від excel до pandas dataframe як тип OrdersDict означає вкладені рамки даних, усі робочі таблиці як фрейми даних, зібрані всередині фрейму даних, а його тип - OrdersDict.


1

Так, на жаль, він завжди завантажує повний файл. Якщо ви робите це неодноразово, напевно, найкраще витягнути аркуші для окремих CSV-файлів, а потім завантажити окремо. Ви можете автоматизувати цей процес за допомогою d6tstack, який також додає додаткові функції, такі як перевірка відповідності всіх стовпців на всіх аркушах чи кількох файлах Excel.

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

Див. Приклади d6tstack Excel


0

Якщо ви зберегли файл excel у тій самій папці, що і ваша програма python (Відносна адресація), вам просто потрібно зазначити номер аркуша разом з ім'ям файлу. Синтаксис = pd.read_excel (Назва файлу, 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()
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.