HOWTO · Pandas

Listenwerte in mehreren pandas-Spalten in Zeilen aufteilen

In diesem Tutorial wird erklärt, wie Sie mehrere Spalten in Pandas auflösen.

Auf dieser Seite

Wenn mehrere Spalten eines pandas-DataFrame Listen enthalten, können Sie ihre Elemente mit DataFrame.explode() zu Zeilen erweitern. Beim gemeinsamen Erweitern mehrerer Spalten werden die Elemente an jeder Position einander zugeordnet, sodass zusammengehörige Werte in derselben Ergebniszeile stehen. Das ist sinnvoll, wenn die Listen einer Zeile entsprechende Werte enthalten, etwa Produktnamen und Mengen.

Was DataFrame.explode() bewirkt

DataFrame.explode() wandelt jedes Element einer listenähnlichen Zelle in eine eigene Zeile um. Werte in den übrigen Spalten werden in diesen Zeilen wiederholt; standardmäßig wird auch das ursprüngliche Indexlabel wiederholt. Die Methode gibt einen neuen DataFrame zurück und verändert den Quelldatenrahmen nicht, solange Sie das Ergebnis nicht zuweisen.

Enthält eine Spalte beispielsweise [["pear", "plum"], ["fig"]], entstehen beim Erweitern drei Zeilen. Aus der Zeile mit "pear" und "plum" werden zwei Zeilen, aus der Zeile mit "fig" eine. So lassen sich verschachtelte Werte leichter filtern, gruppieren oder verknüpfen.

Mehrere Spalten mit DataFrame.explode() erweitern

Übergeben Sie die Spaltennamen als Liste an die DataFrame.explode()-Methode. pandas erweitert die ausgewählten Spalten parallel: Die Werte an der ersten Position bleiben zusammen, ebenso die an der zweiten Position und so weiter. In diesem Beispiel wird jedes Produkt seiner Menge zugeordnet.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import pandas as pd

orders = pd.DataFrame(
    {
        "order": ["A", "B"],
        "product": [["pear", "plum"], ["fig", "lime"]],
        "quantity": [[2, 3], [1, 4]],
    }
)

print(orders.explode(["product", "quantity"], ignore_index=True))

Das Ergebnis enthält eine Zeile pro Produkt mit der zugehörigen Menge und dem Bestellwert. Wenn Sie nur product erweitern, bleibt jede ursprüngliche quantity-Liste unverändert in den Ergebniszeilen stehen. Werden beide Spalten ausgewählt, wird das Wertepaar gemeinsam erweitert. Die ausgewählten Spaltennamen müssen sich auf unterschiedliche Spalten im DataFrame beziehen.

Indizes und ignore_index verstehen

Standardmäßig behält die Ausgabe den Quellindex bei. Ein Indexlabel erscheint daher für jede Zeile, die aus der entsprechenden ursprünglichen Zeile entsteht. So können Sie Ergebniszeilen ihrer Quelle zuordnen. Setzen Sie ignore_index=True, wenn Sie stattdessen einen neuen fortlaufenden Index möchten. Dadurch ändern sich die Indexlabels der Ausgabe, nicht aber die Daten oder die Reihenfolge der erweiterten Zeilen.

Im obigen Beispiel mit mehreren Spalten wird ignore_index=True verwendet. Lassen Sie dieses Argument weg, um die ursprünglichen Labels beizubehalten. Beide Varianten können Sie auch beim Erweitern einer einzelnen Spalte verwenden:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import pandas as pd

items = pd.DataFrame({"group": ["north", "south"], "item": [["a", "b"], ["c"]]}, index=[10, 20])
print(items.explode("item"))
print(items.explode("item", ignore_index=True))

Wählen Sie die Variante danach aus, was die nachfolgenden Verarbeitungsschritte benötigen. Wenn der Index eine Bedeutung hat, behalten Sie ihn bei oder übernehmen Sie die Kennung vor dem Zurücksetzen des Index in eine reguläre Spalte. Dient der Index lediglich als Zeilenlabel, erzeugt ignore_index=True eine einfache fortlaufende Nummerierung der erweiterten Ausgabe.

Ungleiche Listenlängen behandeln

Beim gemeinsamen Erweitern mehrerer Spalten müssen die ausgewählten listenähnlichen Werte innerhalb jeder Zeile gleich lang sein. Eine Zeile, in der zwei Produkte einer einzigen Menge zugeordnet werden sollen, lässt sich beispielsweise nicht positionsweise aufteilen. pandas löst für diese Zeile einen ValueError aus, statt eine Zuordnung zu erraten.

Prüfen Sie die Quelldaten und entscheiden Sie vor dem Erweitern, wie fehlende Gegenstücke dargestellt werden sollen. Je nach Aufgabe können Sie die Listen korrigieren, für das fehlende Gegenstück einen expliziten Fehlwert ergänzen oder die Spalten getrennt verarbeiten, wenn ihre Werte nicht zusammengehören. Erweitern Sie die Spalten nicht getrennt, wenn die Werte einander zugeordnet bleiben sollen: Eine unabhängige Erweiterung kann Kombinationen erzeugen, die in den Quelldaten gar nicht vorkommen.

Series.explode() mit apply() als Alternative verwenden

Sie können auch eine Zeilenkennung als Index festlegen, Series.explode() auf jede ausgewählte Series anwenden und die Kennung anschließend wieder als Spalte übernehmen. Dieses Vorgehen ist praktisch, wenn Sie eine Series-Operation spaltenweise anwenden möchten. Die Listen müssen innerhalb jeder Zeile weiterhin gleich lang sein; ungleiche Längen lassen sich damit nicht behandeln.

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import pandas as pd

orders = pd.DataFrame(
    {
        "order": ["A", "B"],
        "product": [["pear", "plum"], ["fig", "lime"]],
        "quantity": [[2, 3], [1, 4]],
    }
)

expanded = orders.set_index("order").apply(pd.Series.explode).reset_index()
print(expanded)

Bei diesen Daten erzeugen beide Ansätze ausgerichtete Zeilen für Produkte und Mengen. Verwenden Sie DataFrame.explode(), wenn Sie die aufzuteilenden Spalten direkt benennen möchten. Das Muster mit Series.explode() und apply() eignet sich, wenn sich die spaltenweise Anwendung der Series-Methode gut in den umgebenden Code einfügt.