432 Stimmen

Verwendung von Pandas zum pd.read_excel() für mehrere Arbeitsblätter desselben Arbeitsbuchs

Ich habe eine große Tabellendatei (.xlsx), die ich mit Python Pandas verarbeite. Es kommt vor, dass ich Daten aus zwei Registerkarten (Blättern) in dieser großen Datei benötige. Eine der Registerkarten enthält eine Menge Daten und die andere nur ein paar einzelne Zellen.

Wenn ich pd.read_excel() für irgendein Arbeitsblatt verwende, scheint es mir, als ob die gesamte Datei geladen wird (nicht nur das Arbeitsblatt, das mich interessiert). Wenn ich die Methode zweimal verwende (einmal für jedes Blatt), muss ich praktisch zweimal das gesamte Arbeitsbuch einlesen (obwohl wir nur das angegebene Blatt verwenden).

Wie lade ich nur bestimmte Blätter mit pd.read_excel()?

620voto

Noah Punkte 19254

Versuchen Sie es mit pd.ExcelFile:

xls = pd.ExcelFile('path_to_file.xls')
df1 = pd.read_excel(xls, 'Blatt1')
df2 = pd.read_excel(xls, 'Blatt2')

Wie von @HaPsantran bemerkt, wird die gesamte Excel-Datei beim Aufruf von ExcelFile() eingelesen (es scheint keinen Weg daran vorbei zu geben). Dies erspart Ihnen lediglich das erneute Einlesen der Datei jedes Mal, wenn Sie auf ein neues Blatt zugreifen möchten.

Beachten Sie, dass das Argument sheet_name für pd.read_excel() der Name des Blatts sein kann (wie oben), eine Ganzzahl, die die Blattnummer angibt (z.B. 0, 1, usw.), eine Liste von Blattnamen oder -indizes oder 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 zurückgegeben (d.h. sheet_name=0).

Wenn None angegeben ist, werden alle Blätter als ein {Blattname:Datenrahmen} Wörterbuch zurückgegeben.

277voto

Vikash Singh Punkte 12293

Es gibt ein paar Optionen:

Lesen Sie alle Blätter direkt in ein geordnetes Dictionary ein.

import pandas as pd

# für pandas Version >= 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheet_name=None)

# für pandas Version < 0.21.0
sheet_to_df_map = pd.read_excel(file_name, sheetname=None)

Lesen Sie das erste Blatt direkt in ein DataFrame ein

df = pd.read_excel('excel_file_path.xls')
# dadurch wird das erste Blatt in df eingelesen

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

xls = pd.ExcelFile('excel_file_path.xls')

# Jetzt können Sie alle Blätter in der Datei auflisten
xls.sheet_names
# ['house', 'house_extra', ...]

# um nur ein Blatt in ein DataFrame zu lesen:
df = pd.read_excel(file_name, sheet_name="house")

Lesen Sie alle Blätter ein und speichern Sie sie in einem Dictionary. Das Gleiche wie oben, aber expliziter.

# um alle Blätter in ein Mapping einzulesen
sheet_to_df_map = {}
for sheet_name in xls.sheet_names:
    sheet_to_df_map[sheet_name] = xls.parse(sheet_name)
    # Sie können auch Sheet-Indexe [0,1,2..] anstelle des Blattnamens verwenden.

Danke @ihightower für den Hinweis darauf, wie alle Blätter zu lesen sind, und @toto_tico, @red-headphone für den Hinweis auf das Versionsproblem.

sheetname : string, int, gemischte Liste von Strings/Ints oder None, Standardwert 0 Veraltet seit Version 0.21.0: Verwenden Sie stattdessen sheet_name Quellenlink

50voto

Mat0kan Punkte 521

Sie könnten auch den Tabellennamen als Parameter angeben:

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

wird nur das Blatt "sheet_name" hochladen.

48voto

Elliott Punkte 1291

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 zurück. für das zweite Arbeitsblatt:

sheet2 = xls.parse(1)

33voto

Gonçalo Peres Punkte 6179

Es gibt verschiedene Optionen, je nach Anwendungsfall:

  1. Wenn man die Blattnamen nicht kennt.

  2. Wenn der Blattname nicht relevant ist.

  3. Wenn man den Namen der Blätter kennt.

Im Folgenden werden wir uns jede der Optionen genauer ansehen.

Siehe den Abschnitt Hinweise für Informationen wie das Herausfinden der Blattnamen.


Option 1

Wenn man die Blattnamen nicht kennt

# Alle Blätter in Ihrer Datei lesen
df = pd.read_excel('DATEINAME.xlsx', sheet_name=None)

# Gibt alle Blattnamen in einem geordneten Wörterbuch aus
print(df.keys())

Dann kann man je nach dem gewünschten Blatt jedes einzelne an ein spezifisches dataframe übergeben, wie zum Beispiel

sheet1_df = pd.read_excel('DATEINAME.xlsx', sheet_name=BLATT1NAME)
sheet2_df = pd.read_excel('DATEINAME.xlsx', sheet_name=BLATT2NAME)

Option 2

Wenn der Name nicht relevant ist und es nur um die Position des Blattes geht. Angenommen, man möchte nur das erste Blatt

# Alle Blätter in Ihrer Datei lesen
df = pd.read_excel('DATEINAME.xlsx', sheet_name=None)

blatt1 = list(df.keys())[0]

Dann kann man je nach dem Blattnamen jedes einzelne an ein spezifisches dataframe übergeben, wie zum Beispiel

sheet1_df = pd.read_excel('DATEINAME.xlsx', sheet_name=BLATT1NAME)

Option 3

Hier betrachten wir den Fall, dass man die Namen der Blätter kennt. Für die Beispiele nehmen wir an, dass es drei Blätter mit den Namen Blatt1, Blatt2 und Blatt3 gibt. Der Inhalt in jedem sieht gleich aus und sieht so aus

     0         1     2
0   85   January  2000
1   95  February  2001
2  105     March  2002
3  115     April  2003
4  125       May  2004
5  135      June  2005

Je nach den Zielen gibt es verschiedene Ansätze:

  • Alles in einem Dataframe speichern. Ein Ansatz wäre, die Blätter wie folgt zu verknüpfen

    sheets = ['Blatt1', 'Blatt2', 'Blatt3']
    df = pd.concat([pd.read_excel('DATEINAME.xlsx', sheet_name = sheet) for sheet in sheets], ignore_index = True)
    
    [Ergebnis]:
    
          0         1     2
    0    85   January  2000
    1    95  February  2001
    2   105     March  2002
    3   115     April  2003
    4   125       May  2004
    5   135      June  2005
    6    85   January  2000
    7    95  February  2001
    8   105     March  2002
    9   115     April  2003
    10  125       May  2004
    11  135      June  2005
    12   85   January  2000
    13   95  February  2001
    14  105     March  2002
    15  115     April  2003
    16  125       May  2004
    17  135      June  2005

    Im Grunde funktioniert pandas.concat so (Quelle):

    enter image description here

  • Jedes Blatt in einem separaten Dataframe speichern (nennen wir sie df1, df2, ...)

    sheets = ['Blatt1', 'Blatt2', 'Blatt3']
    
    for i, sheet in enumerate(sheets):
        globals()['df' + str(i + 1)] = pd.read_excel('DATEINAME.xlsx', sheet_name = sheet)
    
    [Ergebnis]:
    
    # df1
         0         1     2
    0   85   January  2000
    1   95  February  2001
    2  105     March  2002
    3  115     April  2003
    4  125       May  2004
    5  135      June  2005
    
    # df2
         0         1     2
    0   85   January  2000
    1   95  February  2001
    2  105     March  2002
    3  115     April  2003
    4  125       May  2004
    5  135      June  2005
    
    # df3
         0         1     2
    0   85   January  2000
    1   95  February  2001
    2  105     March  2002
    3  115     April  2003
    4  125       May  2004
    5  135      June  2005

Hinweise:

  • Wenn man die Blattnamen wissen möchte, kann man die Klasse ExcelFile wie folgt verwenden

    blätter = pd.ExcelFile('DATEINAME.xlsx').sheet_names
    
    [Ergebnis]: ['Blatt1', 'Blatt2', 'Blatt3']
  • In diesem Fall wird angenommen, dass die Datei DATEINAME.xlsx im gleichen Verzeichnis wie das Skript liegt, das ausgeführt wird.

    • Wenn die Datei in einem Ordner des aktuellen Verzeichnisses namens Data liegt, könnte man r'./Data/DATEINAME.xlsx' verwenden, um eine Variable wie Pfad zu erstellen, wie folgt

       path = r'./Data/Test.xlsx'
      
       df = pd.read_excel(r'./Data/DATEINAME.xlsx', sheet_name=None)
  • Dies könnte eine relevante Lektüre sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X