Python-Praxis: Excel-Daten nutzen

Seite 2: Mit pandas in ein Excel-Arbeitsblatt schreiben

Inhaltsverzeichnis

Zu diesem Zweck stellt die pandas-Bibliothek die DataFrame-Methode to_excel() zur Verfügung. Die folgende Anweisung erstellt in der Arbeitsmappe Demo1.xlsx ein Arbeitsblatt mit dem Namen Umsätze 2. Quartal 2023 und schreibt in dieses die in dem zuvor erstellten DataFrame (siehe vorhergehendes Listing) gespeicherten Daten.

data_frame.to_excel('Demo1.xlsx', sheet_name='Umsätze 2. Quartal 2023', index=False)

Zu beachten ist, dass die Ziel-Arbeitsmappe bereits vorhanden sein muss und dass to_excel() einen bestehenden Inhalt dort überschreibt. Die Angabe index=False verhindert, dass die im DataFrame gespeicherten Datenzeilen-Indizes mitgeschrieben werden; die Standardeinstellung ist True.

Zwei weitere Parameter der to_excel()-Methode sind columns und startcol. columns ist das Gegenstück zum read_excel()-Parameter usecols. Falls Developer nicht bereits beim Einlesen der Excel-Daten in den DataFrame eine Vorauswahl getroffen haben, können sie usecols eine Liste mit den gewünschten Spalten zuweisen. Wenn die Spalten nebeneinanderliegen, bietet sich alternativ der Parameter startcol an. Der Integerwert legt die Spalte fest, ab der to_excel() in die Excel-Tabelle schreibt. Der Parameter startrow verhält sich analog und legt die erste Datenzeile fest. Um die Spaltennamen neu festzulegen, übergibt man dem header-Parameter eine Liste mit den gewünschten neuen Namen. Mit der Angabe header=False schreibt to_excel() die Daten ohne Spaltenüberschriften in die Excel-Tabelle.

Wollen Entwicklerinnen und Entwickler berechnete Daten in eine Arbeitsmappe schreiben, müssen sie zuvor einen eigenen DataFrame erstellen. Dafür gibt es mehrere Wege, zum Beispiel übergibt man der __init__()-Methode der DataFrame-Klasse die gewünschten Daten. Der columns-Parameter definiert dabei die Spaltennamen. Die folgende Anweisung speichert im DataFrame die Umsätze der Bezirke A und B des ersten Halbjahrs (I. Quartal und II. Quartal).

data_frame = pandas.DataFrame([['Bezirk A', 19500, 13500], ['Bezirk B', 18400, 25100]], columns=['', 'I. Quartal', 'II. Quartal'])

Oder Developer speichern die Daten zunächst in einem Dictionary und übergeben dieses anschließend der __init__()-Methode. In diesem Fall bezieht __init__()- die Spaltennamen für den DataFrame aus den Schlüsseln und die Daten aus den Werten der Dictionary-Elemente. Die folgenden Anweisungen erstellen einen DataFrame mit den Gesamtumsätzen pro Quartal und schreiben diese anschließend in ein Arbeitsblatt Gesamtumsätze 2023 der Arbeitsmappe Demo1.xlsx.

import pandas

data_frame = pandas.read_excel('Demo.xlsx')

summe_quartal1_2023 = data_frame['I. Quartal'].sum()
summe_quartal2_2023 = data_frame['II. Quartal'].sum()
summe_quartal3_2023 = data_frame['III. Quartal'].sum()
summe_quartal4_2023 = data_frame['IV. Quartal'].sum()

umsaetze_dic = {
    'Umsatz 1. Quartal': [summe_quartal1_2023],
    'Umsatz 2. Quartal': [summe_quartal2_2023],
    'Umsatz 3. Quartal': [summe_quartal3_2023],
    'Umsatz 4. Quartal': [summe_quartal4_2023]
}

data_frame_umsaetze = pandas.DataFrame(umsaetze_dic)
data_frame_umsaetze.to_excel('Demo1.xlsx', sheet_name='Gesamtumsätze 2023', index=False)

Die Werte im Dictionary umsaetze_dic sind, obwohl einelementig, als Liste angegeben, da die Länge der Werte im Dictionary übereinstimmen muss, wenn man ein Dictionary an die __init__()-Methode übergibt. Das ist bei einfachen Werten wie hier bei den Umsätzen in der Regel nicht der Fall, da die Summen ja unterschiedliche Beträge ergeben.Es gibt noch eine Möglichkeit, den DataFrame zu erstellen, um auch einfache Werte im Dictionary zu notieren: from_dict() wandelt ein Dictionary direkt in einen DataFrame um. Der Parameter orient legt dabei fest, dass die Schlüssel des Dictionary, statt als Spaltenüberschriften als Index, also als Zeilenüberschriften des zu erstellenden DataFrame verwendet werden. Der obligatorische Parameter columns enthält die gewünschten Spaltenüberschriften:

…
umsaetze_dic = {
    'Umsatz 1. Quartal': summe_quartal1_2023,
    'Umsatz 2. Quartal': summe_quartal2_2023,
    'Umsatz 3. Quartal': summe_quartal3_2023,
    'Umsatz 4. Quartal': summe_quartal4_2023
}

data_frame_umsaetze = pandas.DataFrame.from_dict(umsaetze_dic, orient='index', columns=['Summe'])
data_frame_umsaetze.to_excel('Demo1.xlsx', sheet_name='Gesamtumsätze 2023')

Die Daten werden dann in folgender Anordnung nach Excel geschrieben:

                    Summe
Umsatz 1. Quartal   63400
Umsatz 2. Quartal   73500
Umsatz 3. Quartal   77500
Umsatz 4. Quartal   84000

Die Angabe index=False entfällt in dieser Variante beim Aufruf von to_excel(), da die Indizes, die hier ja aus den Quartalsangaben bestehen, ausdrücklich geschrieben werden sollen.