Pandas-Datenumformung (pivot / melt / stack / unstack)
Datenumformung ist eine häufige Operation in der Datenanalyse und wird verwendet, um die Layoutstruktur von Daten zu ändern. Pandas bietet Funktionen wie pivot, melt, stack und unstack, um zwischen langem Format und breitem Format zu konvertieren.
pivot Pivot-Tabelle
pivotKonvertiert Daten im langen Format in das breite Format, ähnlich der PivotTable-Funktion von Excel.
Grundlegende Verwendung
Beispiel
# Daten im langen Format erstellen
df = pd.DataFrame({
"Date": ["2024-01-01", "2024-01-01", "2024-01-02", "2024-01-02"],
"Produkt": ["A", "B", "A", "B"],
"Verkäufe": [100, 150, 120, 90]
})
print("Daten im langen Format:")
print(df)
print()
# In das breite Format konvertieren
pivot_df = df.pivot(index="Date", columns="Product", values="Sales")
print("Daten im breiten Format:")
print(pivot_df)
Mehrfachindex
Beispiel
df = pd.DataFrame({
"Year": ["2024", "2024", "2024", "2024"],
"Quarter": ["Q1", "Q1", "Q2", "Q2"],
"Produkt": ["A", "B", "A", "B"],
"Verkäufe": [100, 150, 120, 90]
})
print("Daten:")
print(df)
print()
# Pivot mit mehreren Indizes
pivot_df = df.pivot(index=["Year", "Quarter"], columns="Product", values="Sales")
print("Pivot mit mehreren Indizes:")
print(pivot_df)
Aggregatfunktion
Beispiel
# Fall mit doppelten Werten
df = pd.DataFrame({
"Date": ["2024-01-01", "2024-01-01", "2024-01-01", "2024-01-02"],
"Produkt": ["A", "A", "B", "B"],
"Verkäufe": [100, 110, 80, 90]
})
print("Daten mit doppelten Werten:")
print(df)
print()
# pivot unterstützt standardmäßig keine doppelten Werte, Sie müssen pivot_table verwenden und eine Aggregatfunktion angeben
pivot_df = df.pivot_table(index="Date", columns="Product", values="Sales", aggfunc="sum")
print("Aggregation mit sum:")
print(pivot_df)
print()
# mean verwenden
print("Aggregation mit mean:")
print(df.pivot_table(index="Date", columns="Product", values="Sales", aggfunc="mean"))
pivotDoppelte Werte sind nicht erlaubt; wenn doppelte Werte vorhanden sind, verwenden Siepivot_tableund geben Sie eine Aggregatfunktion an.
melt Unpivot
meltKonvertiert Daten im breiten Format in das lange Format, die umgekehrte Operation von pivot.
Beispiel
# Daten im breiten Format erstellen
df = pd.DataFrame({
"Date": ["2024-01-01", "2024-01-02"],
"A": [100, 120],
"B": [150, 90]
})
print("Daten im breiten Format:")
print(df)
print()
# In das lange Format konvertieren
melted = df.melt(id_vars="Date", var_name="Product", value_name="Sales")
print("Daten im langen Format:")
print(melted)
Mehrere Spalten unverändert lassen
Beispiel
df = pd.DataFrame({
"Stadt": ["Beijing", "Shanghai"],
"2023 Revenue": [1000, 800],
"2023 Profit": [200, 150],
"2024 Revenue": [1200, 950],
"2024 Profit": [250, 180]
})
print("Breites Format:")
print(df)
print()
# "City" unverändert lassen, andere Spalten ins lange Format konvertieren
melted = df.melt(
id_vars="City",
var_name="Indicator",
value_name="Value"
)
print("Langes Format:")
print(melted)
stack und unstack
stack und unstack sind Umformungsfunktionen, die auf MultiIndex spezialisiert sind.
unstack
Beispiel
# Daten mit mehreren Indexebenen erstellen
df = pd.DataFrame({
"A": [1, 2, 3, 4],
"B": [5, 6, 7, 8]
}, index=pd.MultiIndex.from_tuples(
[("X", 1), ("X", 2), ("Y", 1), ("Y", 2)],
names=["Kategorie", "Nummer"]
))
print("Mehrstufige Indexdaten:")
print(df)
print()
# unstack wandelt inneren Index in Spalten um
print("Nach unstack:")
print(df.unstack())
stack
Beispiel
# Breitformat erstellen (mit Spaltenindex)
df = pd.DataFrame({
("A", "X"): [1, 2],
("A", "Y"): [3, 4],
("B", "X"): [5, 6],
("B", "Y"): [7, 8]
})
print("Mit mehrstufigem Spaltenindex:")
print(df)
print()
# stack wandelt Spaltenindex in inneren Index um
print("Nach Stack:")
print(df.stack())
Übung: Geschäftsbericht-Konvertierung
Beispiel
# Geschäftsdaten simulieren - Verkaufsdatensätze
sales = pd.DataFrame({
"Date": ["2024-01"] * 4,
"Produkt": ["Telefon", "Computer", "Tablet", "Kopfhörer"],
"Kanal": ["Online", "Online", "Offline", "Online"],
"Umsatzbetrag": [10000, 20000, 8000, 5000]
})
print("Umsatzrohdaten:")
print(sales)
print()
# Mit Pivot umwandeln
pivot = sales.pivot_table(
index="Produkt",
columns="Kanal",
values="Umsatzbetrag",
aggfunc="sum",
fill_value=0
)
print("Kanalumsatz-Pivot:")
print(pivot)
print()
# In Langformat wiederherstellen
print("In Langformat wiederhergestellt:")
print(pivot.reset_index().melt(id_vars="Product", var_name="Channel", value_name="Sales Amount"))
Auswahl der Umformungsfunktion
| Funktion | Zweck | Typisches Szenario |
|---|---|---|
pivot |
Lang → Breit | Zeilen-Spalten-Konvertierung |
pivot_table |
Lang → Breit (mit Aggregation) | Wenn doppelte Werte vorliegen |
melt |
Breit → Lang | Datenaufbereitung |
unstack |
Index → Spalte | Mehrstufiger Index |
stack |
Spalte → Index | Mehrstufiger Index |
Andere ErweiterungenDer Zweck der Datenumformung besteht darin, Daten für die Analyse oder Präsentation besser geeignet zu machen. Wählen Sie die geeignete Konvertierungsmethode basierend auf den nachgelagerten Anforderungen aus.