Verwenden von Pandas zu pd.read_excel () für mehrere Arbeitsblätter derselben Arbeitsmappe

165

Ich habe eine große Tabellenkalkulationsdatei (.xlsx), die ich mit Python-Pandas verarbeite. Es kommt vor, dass ich Daten von zwei Registerkarten in dieser großen Datei benötige. Eine der Registerkarten enthält eine Menge Daten und die andere enthält nur wenige quadratische Zellen.

Wenn ich pd.read_excel () in einem Arbeitsblatt verwende, sieht es für mich so aus, als ob die gesamte Datei geladen ist (nicht nur das Arbeitsblatt, an dem ich interessiert bin). Wenn ich die Methode also zweimal verwende (einmal für jedes Blatt), muss ich effektiv die gesamte Arbeitsmappe zweimal einlesen lassen (obwohl wir nur das angegebene Blatt verwenden).

Benutze ich es falsch oder ist es nur auf diese Weise begrenzt?

Danke dir!

HaPsantran
quelle

Antworten:

243

Versuchen Sie pd.ExcelFile:

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

Wie von @HaPsantran festgestellt, wird die gesamte Excel-Datei während des ExcelFile()Aufrufs eingelesen (es scheint keinen Weg zu geben, dies zu umgehen ). Dies erspart Ihnen lediglich, jedes Mal, wenn Sie auf ein neues Blatt zugreifen möchten, dieselbe Datei lesen zu müssen.

Beachten Sie, dass das sheet_nameArgument to pd.read_excel()der Name des Blattes (wie oben), eine Ganzzahl, die die Blattnummer angibt (z. B. 0, 1 usw.), eine Liste von Blattnamen oder -indizes oder sein kann None. Wenn eine Liste bereitgestellt wird, wird ein Wörterbuch zurückgegeben, in dem die Schlüssel die Blattnamen / -indizes und die Werte die Datenrahmen sind. Standardmäßig wird einfach das erste Blatt (dh sheet_name=0) zurückgegeben.

Wenn Noneangegeben, werden alle Blätter als {sheet_name:dataframe}Wörterbuch zurückgegeben.

Noah
quelle
4
FWIW, es sieht so aus, als ob (das letzte Mal, als ich es getestet habe) die erste Zeile in alles geladen wird. Es gibt also keine Möglichkeit, nur ein einzelnes Blatt effizient einzuziehen, aber für das Erhalten mehrerer Blätter sind nicht mehrere Lasten des gesamten Blattes erforderlich.
HaPsantran
1
Diese Antwort wurde von Pandas abgelehnt und stürzt jetzt in Version 0.21.0 für mich ab. Es sollte durch das von @ Mat0kan angegebene ersetzt werden.
DStauffman
1
@DStauffman Dies funktioniert immer noch gut für mich und ich sehe keinen Hinweis aus dem Code oder den Dokumenten, dass dies veraltet ist. Wenn Sie Probleme damit haben, würde ich ein Problem auf dem Github für Pandas oder xlrd (die von Pandas verwendete Python Excel-Parsing-Bibliothek) einreichen
Noah
@Noah, danke, ich habe mir das noch etwas genauer angesehen und du hast Recht, es funktioniert immer noch, solange ich es benutze sheet_nameund nicht sheetname. Ich wusste nicht, dass dies der veraltete Teil war, da er immer noch an der Methode read_excel arbeitete, aber nicht an der Analysemethode.
DStauffman
@Noah In der Tat eine schöne Antwort. Gibt es eine Möglichkeit, die aktive Zelle in der von Ihnen gelesenen Excel-Tabelle zu finden?
Eswar
97

Es gibt 3 Möglichkeiten:

Lesen Sie alle Blätter direkt in ein geordnetes Wörterbuch.

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)

Vielen Dank an @ihightower für den Hinweis und @toto_tico für den Hinweis auf das Versionsproblem.

Lesen Sie das erste Blatt direkt in den Datenrahmen

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

Lesen Sie die Excel-Datei und erhalten Sie eine Liste der Blätter. Wählen Sie dann die Blätter aus und laden Sie sie.

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

Lesen Sie alle Blätter und speichern Sie sie in einem Wörterbuch. Gleich wie zuerst, aber expliziter.

# 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: Vielen Dank an @toto_tico für den Hinweis auf das Versionsproblem.

Sheetname: string, int, gemischte Liste von Strings / Ints oder None, default 0 Veraltet seit Version 0.21.0: Verwenden Sie SHEET_NAME stattdessen Quellen - Link

Vikash Singh
quelle
12
In den neuesten Pandas, die ich habe (0.20.3), um alle Blätter auf einer Karte zu lesen. Alles, was benötigt wird df_sheet_map = pd.read_excel(file_fullpath, sheetname=None), ist , dass die Blätter automatisch in einem Wörterbuch enthalten sind. Und auf das Blatt als Datenrahmen wie df_sheet_map['house']
folgt
32

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

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

gibt das erste Arbeitsblatt. für das zweite Arbeitsblatt:

sheet2 = xls.parse(1)
Elliott
quelle
7
Wenn Sie eine Liste der Blattnamen wünschen, geben Sie einfach xls.sheet_names
Stefano Fedele
28

Sie können auch den Blattnamen als Parameter angeben:

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

lädt nur das Blatt hoch "sheet_name".

Mat0kan
quelle
9
pd.read_excel('filename.xlsx') 

Standardmäßig lesen Sie das erste Blatt der Arbeitsmappe.

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

Lesen Sie das spezifische Blatt der Arbeitsmappe und

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

Lesen Sie alle Arbeitsblätter von Excel bis Pandas Datenrahmen als Typ von OrderedDict bedeutet verschachtelte Datenrahmen, alle Arbeitsblätter als Datenrahmen innerhalb von Datenrahmen gesammelt und sein Typ ist OrderedDict.

Ashu007
quelle
1

Ja, leider wird immer die vollständige Datei geladen. Wenn Sie dies wiederholt tun, extrahieren Sie die Blätter wahrscheinlich am besten in separate CSVs und laden Sie sie dann separat. Sie können diesen Prozess mit d6tstack automatisieren, wodurch zusätzliche Funktionen hinzugefügt werden , z. B. die Überprüfung, ob alle Spalten für alle Blätter oder mehrere Excel-Dateien gleich sind.

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

Siehe Beispiele für d6tstack Excel

Stadtmensch
quelle
0

Wenn Sie die Excel-Datei im selben Ordner wie Ihr Python-Programm (Relative Addressing) gespeichert haben, müssen Sie nur die Blattnummer und den Dateinamen angeben. Syntax = pd.read_excel (Dateiname, SheetNo) Beispiel:

    data=pd.read_excel("wt_vs_ht.xlsx","Sheet2")
    print(data)
    x=data.Height
    y=data.Weight
    plt.plot(x,y,'x')
    plt.show()
Nikita Agarwala
quelle