2014-10-23 8 views
31

Ich habe eine große Arbeitsblattdatei (.xlsx), die ich mit Python-Pandas verarbeite. Es kommt vor, dass ich Daten von zwei Tabs in dieser großen Datei benötige. Einer der Tabs hat eine Menge Daten und der andere ist nur ein paar quadratische Zellen.Verwenden von Pandas zu pd.read_excel() für mehrere Arbeitsblätter derselben Arbeitsmappe

Wenn ich pd.read_excel() auf jedes Arbeitsblatt verwenden, sieht es für mich wie die gesamte Datei (nicht nur das Arbeitsblatt Ich habe Interesse an) geladen wird. Wenn ich also die Methode zweimal benutze (einmal für jedes Blatt), muss ich tatsächlich das gesamte Arbeitsbuch zweimal lesen (obwohl wir nur das angegebene Blatt verwenden).

Verwende ich es falsch oder ist es auf diese Weise begrenzt?

Vielen Dank!

Antwort

39

Versuchen pd.ExcelFile:

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

Wie @HaPsantran erwähnt, wird die gesamte Excel-Datei eingelesen während des ExcelFile() Anrufs (es scheint keinen Weg, um dies zu sein). Dadurch müssen Sie nicht jedes Mal dieselbe Datei lesen, wenn Sie auf ein neues Blatt zugreifen möchten.

beachten, dass das Argument sheet_namepd.read_excel() der Name des Blattes sein kann (wie oben), eine ganze Zahl Angabe die Blattnummer (zB 0, 1, usw.), eine Liste von Blattnamen oder Indizes oder None. Wenn eine Liste bereitgestellt wird, gibt sie ein Wörterbuch zurück, wobei die Schlüssel die Blattnamen/Indizes und die Werte die Datenrahmen sind. Standardmäßig wird einfach das erste Blatt zurückgegeben (z. B. sheet_name=0).

Wenn None angegeben ist, werden alle Blätter zurückgegeben, wie ein {sheet_name:dataframe} Wörterbuch.

+1

FWIW, es sieht aus wie (letzte Mal, dass ich es getestet) den ersten Linienlasten in * alles *, also gibt es keine Möglichkeit, effizient ein einzelnes Blatt einziehen, aber mindestens mehrere Blätter zu erhalten, erfordert nicht mehrere Lasten des gesamten Blattes. – HaPsantran

+0

Diese Antwort wurde von Pandas veraltet und stürzt jetzt für mich in v0.21.0 ab. Es sollte durch den von @ Mat0kan gegebenen ersetzt werden. – DStauffman

+0

@Dtauffman Das funktioniert immer noch gut für mich und ich sehe keine Hinweise aus dem Code oder der Dokumentation, dass dies veraltet ist. Wenn Sie Probleme damit haben, würde ich ein Problem auf dem Github für Pandas oder xlrd (die Python-Excel-Parsing-Bibliothek von Pandas) einreichen – Noah

17

Sie können auch den Index für das Blatt verwenden:

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

wird das erste Arbeitsblatt geben. für das zweite Arbeitsblatt:

sheet2 = xls.parse(1) 
+4

Wenn Sie eine Liste der Blattnamen wollen, geben Sie einfach xls.sheet_names –

11

Sie auch die Blattnamen als Parameter angeben können:

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

wird nur das Blatt "SHEET_NAME" laden

9

Es gibt 3 Möglichkeiten:

  1. Das erste Blatt direkt in den Datenrahmen einlesen
  2. Lesen Sie die Excel-Datei und erhalten Sie eine Liste der Blätter. Dann wähle und lade die Blätter.
  3. Lesen Sie alle Blätter und speichern Sie sie in einem Wörterbuch.

Codebeispiel:

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) 

UPDATE:

# @ihightower pointed out in the comments that all sheets can be 
# directly read into an ordered dictionary in 1 step 
sheet_to_df_map = pd.read_excel(file_name, sheetname=None) 
+3

in den neuesten Pandas (0,20.3) ein, um alle Blätter zu einer Map zu lesen. Alles, was benötigt wird, ist 'df_sheet_map = pd .read_excel (file_fullpath, sheetname = None) ', so werden die Blätter automatisch in einem Wörterbuch gespeichert. Das Blatt wird als Datenframe wie folgt angezeigt:' df_sheet_map ['house'] '' – ihightower

Verwandte Themen