Hej Leute,

wir wollen Daten analysen, oder? Sonst wärt ihr ja nicht hier! Dazu müssen aber erstmal die Daten in Python importiert werden. Neben Datenbanken sind Dateien das Mittel zum Zweck. Und im Data Science Umfeld sind die Dateien zum großen Teil im Format csv (comma separated value), aber erstaunlich oft eben auch im Excel-Format (xlsx), denn in fast allen Abteilungen einer Firma ist Excel immer noch die Software, mit der Tabellen bearbeitet werden.

Ich zeige euch, wie ihr Excel in Python einlesen könnt. Das ist mit dem richtigen Package überhaupt nicht schwer.

Python: Excel einlesen

Ihr habt die Qual der Wahl. Es gibt nämlich einige Möglichkeiten, xlsx-Dateien nach Python zu bringen. Wollt ihr nur schnell Daten aus einer Excel-Datei holen, dann ist pandas wohl am besten geeignet. Braucht ihr noch mehr Kontrolle oder wollt Formeln auslesen, dann schaut euch xlrd oder openpyxl an. Tatsächlich nutzt pandas xlrd im Hintergrund, um auf die Excel-Daten zuzugreifen.

Eine Jupyter Notebook-Datei mit dem Code für alle drei Möglichkeiten findest Du hier.

xlsx-Dateien mit pandas importieren

Eine populäre Methode, Excel-Dateien in Python einzulesen, ist mit der read_excel-Funktion von pandas. Wenn man als Data Scientist mit Python arbeitet, ist pandas sowieso unverzichtbar. Die read_excel-Funktion kann sowohl xls- (altes Format) als auch xlsx-Dateien verarbeiten und schreibt den Inhalt in ein DataFrame.

import pandas as pd
df = pd.read_excel(“Dateiname“)

dazu gibt es eine ganze Reihe von Parametern, die wichtigsten findet ihr hier:

  • sheet_name = 0
    Hier kann man eine Zahl (beginnend bei 0) oder den Namen des Arbeitsblatts. Standardmäßig wird also das erste Arbeitsblatt eingelesen. Gibt man hier eine Liste an, dann wird ein Dictionary von DataFrames zurückgegeben (siehe unten)
  • skiprows = None
    Will man die ersten Zeilen überspringen, was ja relativ typisch für Excel-Tabellen ist, denn oben sollte hoffentlich Titel und Beschreibung stehen, geht das mit diesem Parameter, der einfach sagt, wie viele Zeilen man überspringen will. Wie in Python üblich, fängt das Zählen bei 0 an, d.h. wenn ich ab der 4. Zeile einlesen will, benutze ich skiprows=3.
  • header = 0
    Die Zeile, in der der Header, also die Spaltenüberschriften steht. Bei 0 wird also die erste Zeile verwendet. Gibt es keine Spaltenüberschriften, gibt man None an.
  • names = None
    Diesem Parameter kann man eine Liste mit den Spaltennamen übergeben
  • usecols = None
    Hier gibt man an, dass man nur ausgewählte Spalten einlesen möchte. Dafür übergibt man am besten eine Liste mit Spaltennummern oder Spaltennamen.
  • dtype = None
    Möchte man andere Datentypen als die automatisch erkannten verwenden, kann man ein dictionary mit den Datentypen der Spalten angeben.
  • nrows = None
    Möchte man nicht alle Zeilen einlesen, kann man das mit dem Parameter nrows begrenzen.

 

Das sollte die meisten Anwendungsfälle abdecken. Braucht ihr noch weitere Spezialisierungen, dann schaut in die API Referenz von read_excel.

Mehrere Excel-Arbeitsblätter gleichzeitig importieren

Wie bei der Erklärung zum Parameter sheet_name geschrieben, kann man dort auch eine Liste mit den Arbeitsblatt-Nummern oder –Namen angeben. Dann wird kein DataFrame zurückgegeben, sondern ein Dictionary von DataFrames.

Mappe = pd.read_excel("Beispiel-Excel.xlsx", sheet_name=['Tabelle1','Tabelle2','Tabelle3'], skiprows=3)
print(type(Mappe))
print(Mappe.keys())
print(Mappe['Tabelle3'].head())
Datenanalyse mit Python - 5 Tage Minikurs
In dem kostenlosen 5-Tage Minikurs Datenanalyse mit Python analysieren wir zusammen einen realen Datensatz: Von der richtigen Entwicklungsumgebung über erste Zusammenfassungsstatistiken mit pandas bis hin zu linearer Regression und schicken Grafiken mit seaborn.

Excel-Datei importieren mit dem Package xlrd

Mit dem Package xlrd habt ihr deutlich mehr Kontrolle über die Excel-Arbeitsmappe, aber es ist natürlich auch ein bisschen aufwändiger. Tatsächlich wird aber xlrd aktuell nicht mehr weiterentwickelt. Auf der GitHub-Seite steht, dass man doch besser openpyxl verwenden soll.

Neben xlrd zum Lesen gibt es auch xlwt zum Schreiben von xls-Dateien (Excel 97 – 2003) und xlutils, wenn man Excel-Dateien modifizieren will.

Leicht ist erstmal das Öffnen der Datei

wb = xlrd.open_workbook("Beispiel-Excel.xlsx")

Mit sheet_names bekommt man die Namen der Arbeitsblätter

sheet_names = wb.sheet_names()

Ein Arbeitsblatt kann man dann über den Namen ansprechen, also z.B.

Tab1 = wb.sheet_by_name('Tabelle1')

Die xlrd API ist sehr logisch aufgebaut und sollte für Leute, die schon mal APIs gelesen haben, kein Problem darstellen.

  • Das Modul book beinhaltet alles für den Umgang mit der gesamten Arbeitsmappe. Die Klasse xlrd.book.Book enthält den Inhalt der Arbeitsmappe.
  • Das Modul sheet beinhaltet alles für den Umgang mit einem Arbeitsblatt. Die zugehörige Klasse xlrd.sheet.Sheet enthält den Inhalt eines Arbeitsblatts
  • formatting ist noch erwähnenswert, wenn man die Formatierungen auslesen will
  • formula befasst sich (Achtung) nicht mit den Formeln einer Zelle, sondern mit dem Namensmanager. Will man die Formeln einzelner Zellen auslesen, geht das mit openpyxl oder
  • xldate hilft beim Umgang mit Datum und Zeit

Python-Package openpyxl: Excel-Dateien einlesen

Openpyxl scheint aktuell das Package zu sein, welches man nutzen sollte, will man mehr machen als Daten einlesen. Im letzteren Fall ist meiner Meinung nach pandas zu bevorzugen.

Eine Arbeitsmappe einzulesen ist auch hier super einfach.

from openpyxl import load_workbook
wb2 = load_workbook("Beispiel-Excel.xlsx")

Mit dem Flag data_only kann man einstellen, ob Formeln oder die berechneten Werte eingelesen werden sollen. Standardmäßig ist data_only = False, es werden also Formeln eingelesen.

Leider werden Bilder und Charts nicht mit eingelesen, so dass Modifikationen einer Vorlage oder das Einfüllen von Daten in bestehende Excel-Dashboards mit openpyxl nicht vernünftig funktionieren. Dafür scheint xlwings das richtige Tool zu sein, dazu demnächst mehr.

Aber zurück zu openpyxl. Die Arbeitsmappe enthält die Arbeitblätter, auf die dann einfach per Namen zurückgegriffen werden kann

print(wb2.sheetnames)
ws = wb2['Tabelle1']
for i in ws.values:
    print(i)

Um die Daten in ein pandas DataFrame umzuwandeln, könnte man es folgendermaßen machen. In dem Beispiel fängt die Tabelle in Zeile 4 an.

import pandas as pd
df = pd.DataFrame(ws.values)
df.columns = df.iloc[[3]].values.tolist()[0]
df = df[4:]
df.head()

Auch hier wieder der Verweis auf die Dokumentation von openpyxl. Interessant ist auch das Kapitel 12 im kostenlosen Buch Automate the boring stuff, dort geht es tatsächlich um Anwendung vom Package openpyxl.

 

Python: Excel abspeichern

Logisch, neben dem Einlesen von Excel-Dateien wollen wir natürlich auch Excel-Dateien abspeichern können. Eine Jupyter Notebook-Datei mit dem Code für alle drei Möglichkeiten findest Du hier.

Einen DataFrame mit pandas in eine xlsx-Datei schreiben

Mit pandas ist es wieder sehr leicht, einen DataFrame in eine Excel-Datei zu schreiben. Das geht über die Funktion to_excel, also z.B.

diamonds.to_excel("Diamonds.xlsx", sheet_name='Diamonds')

Dabei gibt es folgende Parameter zur Individualisierung. Es gibt noch ein paar mehr, aber gebraucht habe ich die bisher nicht.

  • na_rep = ''
    Wie sollen fehlende Werte dargestellt werden. Standard ist hier leer.
  • float_format=None
    Hier kann das Format für Kommazahlen angegeben werden
  • columns = None
    Wenn nicht alle Spalten geschrieben werden sollen, dann kann man diese hier spezifizieren
  • header = True
    Sollen Spaltennamen geschrieben werden. Es geht auch eine Liste mit den Spaltennamen.
  • index = True
    Flag, ob ein Zeilenindex geschrieben werden soll.
  • index_label = None
    Der Spaltenname für die Index-Spalte
  • startrow = 0
    Die Zeile in der Excel-Datei, ab der die Tabelle geschrieben werden soll
  • startcol = 0
    Die Spalte in der Excel-Datei, ab der die Tabelle geschrieben werden soll
Datenanalyse mit Python – 5 Tage Minikurs
In dem kostenlosen 5-Tage Minikurs Datenanalyse mit Python analysieren wir zusammen einen realen Datensatz: Von der richtigen Entwicklungsumgebung über erste Zusammenfassungsstatistiken mit pandas bis hin zu linearer Regression und schicken Grafiken mit seaborn.

Mehrere Arbeitsblätter in eine Excel-Datei schreiben

Auch das ist mit pandas kein Problem. Allerdings muss man dazu einen ExcelWriter verwenden. Das geht folgendermaßen:

with pd.ExcelWriter('test.xlsx') as writer:
    iris.to_excel(writer, sheet_name='iris')
    tips.to_excel(writer, sheet_name='tips')

 

Eine Excel-Datei mit xlwt schreiben

Das Schreiben einer xls-Datei (Achtung, xlwt unterstützt nicht das neue xlsx-Format, welches seit Excel 2007 verwendet wird)

import xlwt
from datetime import datetime
 
wb = xlwt.Workbook()
ws = wb.add_sheet('Tabelle1')
 
datumStyle = xlwt.easyxf(num_format_str='DD.MM.YYYY')
 
ws.write(0, 0, 1)
ws.write(0, 1, 1)
ws.write(0, 2, xlwt.Formula("A1+B1"))
 
ws.write(1, 0, datetime.now(),datumStyle)
ws.write(1, 2, 3.1415)
 
wb.save('Beispiel-xlwt.xls')

Eine Excel-Datei mit openpyxl schreiben

Das Schreiben der Datei ist wieder überhaupt kein Problem:

from openpyxl import Workbook
wb = Workbook()
# … Arbeitsmappe befüllen …
wb.save("Beispiel-openpyxl.xlsx")

 

Als Zwischenteil können wir zum Beispiel folgendes machen:

# Das erste Arbeitsblatt aktivieren
ws = wb.active
# Man kann direkt in Zellen schreiben
ws['C1'] = 3.1415
# Auch ganze Zeilen können angehangen werden
ws.append([1, 2, 3])
# Datumsfelder funktionieren auch
import datetime
ws['E2'] = datetime.datetime.now()

 

Fazit zu Excel-Dateien mit Python

Nochmal kurz zusammengefasst, lässt sich sagen:

 

Wollt ihr nur Tabellen einlesen bzw in eine Excel-Datei schreiben, dann benutz am besten pandas. Die Import- bzw. Export-Funktion ist einfach anzuwenden und pandas Datentyp DataFrame ist sowieso ideal, um die Daten weiter zu verarbeiten.
 
Braucht ihr mehr Kontrolle und wollt einzelne Zellen, Formate etc. auslesen oder bearbeiten, benutzt openpyxl. Falls ihr aus unerfindlichen Gründen noch das xls-Format verwenden müsst (ja, das gibt es in manchen Firmen noch), dann verwendet xlrt/xlwt/xlutils.
 
Ich hoffe, ihr habt was Nützliches mitgenommen. Schreibt mir einen Kommentar, welches Package ihr am liebsten verwendet. Und wenn ihr helfen wollt, Data Science Wissen zu verbreiten und mich damit unterstützt, dann teilt den Beitrag auf Twitter oder Facebook.

 

Happy Exceling,

Euer Holger

Datenanalyse mit Python - 5 Tage Minikurs
In dem kostenlosen 5-Tage Minikurs Datenanalyse mit Python analysieren wir zusammen einen realen Datensatz: Von der richtigen Entwicklungsumgebung über erste Zusammenfassungsstatistiken mit pandas bis hin zu linearer Regression und schicken Grafiken mit seaborn.