Pandas df.stack() Funktion
df.stack()ist eine Member-Methode von DataFrame, die verwendet wird, umSpaltenindizes in Zeilenindizes umzuwandeln. Sie "stapelt" die Spalten von Daten im Breitformat in Zeilen und erzeugt eine Series oder einen DataFrame mit einem hierarchischen Index.
Dies ist eine wichtige Operation für die Umformung von Daten, die üblicherweise zusammen mitunstack()verwendet wird, um eine gegenseitige Konvertierung der Daten zu erreichen.
Wortdefinition: stackEs bedeutet "stapeln, aufeinanderlegen"; hier bezieht es sich darauf, Spaltendaten in Zeilen zu "stapeln", wodurch eine breite Tabelle in eine lange Tabelle umgewandelt wird.
Grundlegende Syntax und Parameter
df.stack()ist eine Instanzmethode von DataFrame, die über den Punktoperator aufgerufen wird.
Syntaxformat
DataFrame.stack(level=-1, dropna=True)
Parameterbeschreibung
- Parameter:
level- Typ: int, str, Liste von int oder Liste von str.
- Beschreibung: Gibt die Ebene zum Stapeln an. Bei mehrstufigen Indizes können Sie eine bestimmte Ebenennummer (beginnend bei 0) oder einen Ebenennamen angeben. Der Standardwert ist -1, was die innerste Ebene bedeutet.
- Parameter:
dropna- Typ: Boolean.
- Beschreibung: Ob Zeilen, die im Ergebnis alle NaN sind, verworfen werden sollen. Der Standardwert ist True, wodurch Zeilen entfernt werden, in denen alle Werte NaN sind.
Funktionsbeschreibung
- Rückgabewert: Gibt eine Series oder ein DataFrame zurück. Wenn nur eine Spalte des ursprünglichen DataFrame gestapelt wird, wird eine Series zurückgegeben; andernfalls wird ein DataFrame zurückgegeben.
- Auswirkung: Wandelt Spaltenindizes in Zeilenindizes um und erzeugt ein längeres Datenformat. Die gestapelten Daten liegen im "Long Format" vor, was für statistische Analysen oder Visualisierungen praktisch ist.
Beispiele
Lassen Sie uns anhand einer Reihe von Beispielen von einfach bis komplexdf.stack()seine Verwendung gründlich beherrschen.
Beispiel 1: Grundlegende Verwendung – Spalten in Zeilen umwandeln
Beispiel
import numpy as np
# 1. Breitformat-Daten erstellen (eine Spalte pro Quartal)
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie'],
'Q1': [100, 150, 200],
'Q2': [120, 160, 210],
'Q3': [130, 170, 220]
})
print("=== Originale Breitformat-Daten ===")
print(df)
print(f"Spaltennamen: {df.columns.tolist()}")
# 2. df.stack() verwenden, um Spalten in Zeilen umzuwandeln
stacked = df.stack()
print("n=== df.stack()-Ergebnis ===")
print(stacked)
print(f"nTyp: {type(stacked)}")
# 3. Das Ergebnis zur Überprüfung in einen DataFrame umwandeln
print("n=== In DataFrame umgewandelt ===")
stacked_df = stacked.reset_index()
stacked_df.columns = ['name', 'quarter', 'sales']
print(stacked_df)
Erwartete Ausgabe:
=== 原始宽格式数据 ===
name Q1 Q2 Q3
0 Alice 100 120 130
1 Bob 150 160 170
2 Charlie 'Q2', 'Q3'], columns=['name', 'quarter', 'sales']
...
Code-Erklärung:
- Die ursprünglichen Daten liegen im breiten Format vor, wobei Q1, Q2, Q3 drei Spalten mit Quartalsdaten sind.
stack()Die drei Spalten Q1, Q2, Q3 werden in Zeilen "gestapelt".- Das Ergebnis ist vom Typ Series, mit zwei Indexebenen: Die äußere Ebene ist der ursprüngliche Zeilenindex, und die innere Ebene sind die ursprünglichen Spaltennamen (Quartale).
- Nach dem Stacking werden die Daten zum "langen Format", wobei jede Zeile nur einen Quartalswert enthält.
Beispiel 2: Stapeln mehrstufiger Spaltenindizes
Wenn ein DataFrame einen mehrstufigen Spaltenindex hat, können Sie angeben, welche Ebene gestapelt werden soll.
Beispiel
import numpy as np
# 1. Daten mit einem mehrstufigen Spaltenindex erstellen
# Äußere Ebene: Produkttyp (Elektronik, Möbel)
# Innere Ebene: Quartal (Q1, Q2)
df = pd.DataFrame(
[[100, 110, 200, 210], [150, 160, 180, 190]],
index=['Store_A', 'Store_B'],
columns=pd.MultiIndex.from_tuples([
('Electronics', 'Q1'), ('Electronics', 'Q2'),
('Furniture', 'Q1'), ('Furniture', 'Q2')
], names=['Product', 'Quarter'])
)
print("=== Originaldaten (mehrstufiger Spaltenindex) ===")
print(df)
print(f"Spaltenindex-Ebenen: {df.columns.names}")
# 2. Innere Spaltenebene stapeln (Standard, level=-1)
print("n=== Innere Spaltenebene stapeln (level=-1) ===")
stacked_inner = df.stack()
print(stacked_inner)
# 3. Äußere Spaltenebene stapeln
print("n=== Äußere Spaltenebene stapeln (level=0) ===")
stacked_outer = df.stack(level=0)
print(stacked_outer)
# 4. Alle Spalten stapeln (erzeugt ein längeres Format)
print("n=== Alle Spalten stapeln ===")
stacked_all = df.stack(level=[0, 1])
print(stacked_all)
Erwartete Ausgabe:
=== 原始数据(多层列索引)=== Product Electronics Furniture Quarter Q1 Q2 Q1 Q ...
Code-Erklärung:
- Für einen DataFrame mit einem mehrstufigen Spaltenindex sind die Spaltennamen Tupel: (Product, Quarter).
level=-1Stapeln Sie die innerste Ebene (Standard), d. h. die Ebene Quarter, und das Ergebnis behält Product als Spalten.level=0Stapeln Sie die äußere Ebene, d. h. die Ebene Product, und das Ergebnis behält Quarter als Spalten.- Diese Flexibilität ermöglicht es Ihnen, die zu stapelnde Ebene entsprechend Ihren Analyseanforderungen auszuwählen.
Beispiel 3: Umgang mit fehlenden Werten
Verwenden Sie diedropnaParameter zur Steuerung, wie mit fehlenden Werten umgegangen wird.
Beispiel
import numpy as np
# 1. Daten mit fehlenden Werten erstellen
df = pd.DataFrame({
'name': ['Alice', 'Bob'],
'Math': [100, np.nan],
'Englisch': [90, 85],
'Science': [np.nan, 95]
})
print("=== Originaldaten (mit fehlenden Werten) ===")
print(df)
# 2. dropna=True (Standard), Zeilen entfernen, die ausschließlich NaN sind
print("n=== dropna=True (Standard) ===")
stacked_drop = df.stack(dropna=True)
print(stacked_drop)
# 3. dropna=False, NaN-Werte beibehalten
print("n=== dropna=False ===")
stacked_keep = df.stack(dropna=False)
print(stacked_keep)
# 4. Praktische Anwendung: das gestapelte Ergebnis in ein analysierbares Langformat bringen
print("n=== In ein DataFrame im Langformat organisiert ===")
result = df.set_index('name').stack().reset_index()
result.columns = ['name', 'subject', 'score']
print(result)
# 5. Fehlende Werte entfernen
result_clean = result.dropna()
print("n=== Nach dem Entfernen fehlender Werte ===")
print(result_clean)
Erwartete Ausgabe:
=== 原始数据(包含缺失值)===
name Math English Science
0 Alice 100.0 90.0 NaN
1 Bob NaN 85.0 95.0
2=== 堆叠内层列 (level=-1) ===
Store_A Electronics Q1 100
Q2 110
Furniture Q1 200
Q2 210
Store_B Electronics Q1 150
...
Code-Erklärung:
dropna=True(Standardmäßig) werden Zeilen entfernt, in denen alle Werte NaN sind.- In der Datenanalyse ist es normalerweise notwendig, die Originaldaten beizubehalten und anschließend fehlende Werte nach Bedarf zu entfernen.
- Nach dem Stacking verwenden Sie
reset_index()um den hierarchischen Index in normale Spalten umzuwandeln, damit die spätere Verarbeitung einfacher ist.
Beispiel 4: Kombinierte Verwendung von stack und unstack
stack()undunstack()Sie sind inverse Operationen; ihre gemeinsame Verwendung ermöglicht ein flexibles Umformen der Daten.
Beispiel
# 1. Anfangsdaten erstellen
df = pd.DataFrame({
'product': ['A', 'B', 'C'],
'North': [100, 150, 200],
'South': [180, 170, 160],
'East': [190, 200, 210]
})
print("=== Originaldaten ===")
print(df)
# 2. unstack verwenden, um Regionen in Spalten umzuwandeln (zuerst in einen mehrstufigen Index umwandeln)
df_indexed = df.set_index('product')
print("n=== Nach dem Setzen des Index ===")
print(df_indexed)
# 3. stack verwenden, um Spalten in Zeilen umzuwandeln (stack ist die Umkehrung von unstack)
print("n=== unstack + stack Hin- und Rückumwandlung ===")
# Zuerst unstack
unstacked = df_indexed.unstack()
print("unstack-Ergebnis:")
print(unstacked)
# Dann wieder stacken
restacked = unstacked.stack()
print("nstack zurück:")
print(restacked)
# 4. Vollständiges Beispiel: einen mehrstufigen Index erstellen und dann konvertieren
print("n=== Konvertierung des mehrstufigen Index ===")
# Ein DataFrame mit einem mehrstufigen Index erstellen
multi_df = pd.DataFrame(
[[100, 110], [150, 160]],
index=pd.MultiIndex.from_tuples([('A', '2023'), ('B', '2023')], names=['product', 'year']),
columns=['North', 'South']
)
print("Ursprüngliche Daten mit mehrstufigem Index:")
print(multi_df)
# unstack year
print("nunstack year:")
print(multi_df.unstack(level='year'))
# unstack columns
print("nunstack columns (in Spalten umwandeln):")
print(multi_df.unstack(level='columns'))
Erwartete Ausgabe:
=== unstack + stack 往返 ===
unstack 结果:
product
North A 100
B 150
C 200
South A 180
B 170
...
Code-Erklärung:
stack()Wandelt Spaltenindizes in Zeilenindizes um und verwandelt eine breite Tabelle in eine lange Tabelle.unstack()Konvertiert Zeilenindizes in Spaltenindizes und wandelt eine lange Tabelle in eine breite Tabelle um.- Durch die gemeinsame Nutzung der beiden lässt sich eine beliebige Umformung von Daten erreichen.
- Für die Datenanalyse ist es sehr wichtig, die umgekehrte Beziehung zwischen diesen beiden Operationen zu verstehen.
Andere ErweiterungenTipp:
stack()undunstack()ist ein zentrales Werkzeug für die Umformung von Daten.stack()stapelt Spalten zu Zeilen (breit zu lang),unstack()teilt Zeilen in Spalten auf (lang zu breit).
Pandas Häufige Funktionen