Pandas df.unstack()-Funktion
df.unstack()ist eine Mitgliedsmethode von DataFrame, die verwendet wird, umZeilenindizes in Spaltenindizes umzuwandeln. Sie „packt“ Daten mit hierarchischer Indizierung aus und verschiebt eine oder mehrere Ebenen des Zeilenindex in Spalten.
Dies ist eine wichtige Operation für die Datenumformung, die normalerweise in Verbindung mitstack()verwendet wird, um eine gegenseitige Konvertierung der Daten zu erreichen.
Wortdefinition: unstackEs bedeutet „auspacken, entfalten“; hier bezieht es sich auf das „Entfalten“ des Zeilenindex in Spalten, wodurch eine lange Tabelle in eine breite Tabelle umgewandelt wird.
Grundlegende Syntax und Parameter
df.unstack()Es ist eine Instanzmethode von DataFrame, die über den Punktoperator aufgerufen wird.
Syntaxformat
DataFrame.unstack(level=-1, fill_value=None)
Parameterbeschreibung
- Parameter:
level- Typ: int, str, Liste von int oder Liste von str.
- Beschreibung: Gibt die Ebene an, die in Spalten entstapelt werden soll. Bei einem mehrstufigen Index können Sie eine bestimmte Ebenennummer (beginnend bei 0) oder einen Ebenennamen angeben. Der Standardwert ist -1, was die innerste Ebene bedeutet.
- Parameter:
fill_value- Typ: Skalar oder None.
- Beschreibung: Der Wert, der zum Füllen fehlender Werte verwendet wird, die durch die Unstack-Operation erzeugt werden. Der Standardwert ist None, wodurch NaN beibehalten wird.
Funktionsbeschreibung
- Rückgabewert: Gibt eine Series oder ein DataFrame zurück. Wenn nur eine Zeilenebene des ursprünglichen DataFrame entstapelt wird, wird eine Series zurückgegeben; andernfalls wird ein DataFrame zurückgegeben.
- Wirkung: Verschiebt eine oder mehrere Ebenen des Zeilenindex in den Spaltenindex, wodurch ein breiteres Datenformat entsteht. Die entstapelten Daten liegen im "breiten Format" vor, was das Anzeigen und Vergleichen erleichtert.
Beispiele
Anhand einer Reihe von Beispielen von einfach bis komplex wollen wirdf.unstack()die Verwendung davon gründlich meistern.
Beispiel 1: Grundlegende Verwendung - Zeilen in Spalten umwandeln
Beispiel
# 1. Daten im Langformat erstellen
df = pd.DataFrame({
'product': ['A', 'A', 'B', 'B', 'C', 'C'],
'region': ['North', 'South', 'North', 'South', 'North', 'South'],
'sales': [100, 150, 200, 180, 220, 250]
})
print("=== Ursprüngliche Daten im Langformat ===")
print(df)
# 2. Hierarchische Indizierung einrichten
df_indexed = df.set_index(['product', 'region'])
print("n=== Nach dem Einrichten der hierarchischen Indizierung ===")
print(df_indexed)
# 3. Verwende df.unstack(), um den inneren Index in Spalten umzuwandeln
unstacked = df_indexed.unstack()
print("n=== Ergebnis von df.unstack() ===")
print(unstacked)
# 4. Vereinfachte Ansicht
print("n=== Nur Verkäufe ===")
print(unstacked['sales'])
Erwartete Ausgabe:
=== 原始长格式数据 ===
product region sales
0 A North 100
1 A South 150
2 B North 200
3 B South 180
4 C North 220
5 C South 250
n=== 设置层次化索引后 ===
sales
product region
A North 100
South 150
B North 200
South 180
C North 220
South 250
n=== df.unstack() 结果 ===
sales
region North South
product
A 100 150
B 200 180
C 220 250
n=== 只看销售额 ===
region North South
product
A 100 150
B 200 180
C 220 250
Code-Erklärung:
- Die ursprünglichen Daten liegen im langen Format vor, wobei jede Zeile den Verkaufsbetrag eines Produkts in einer Region erfasst.
- Verwenden Sie
set_index()um einen hierarchischen Index zu erstellen (Produkt als äußere Ebene, Region als innere Ebene). unstack()Die innere Indexregion wird an die Spaltenposition verschoben.- Das Ergebnis liegt im breiten Format vor und ermöglicht einen intuitiven Vergleich der Verkaufsdaten über verschiedene Produkte und Regionen hinweg.
Beispiel 2: Entstapeln eines mehrstufigen Index
Wenn ein DataFrame einen mehrstufigen Zeilenindex hat, können Sie angeben, welche Ebene entstapelt werden soll.
Beispiel
# 1. Daten mit einem mehrstufigen Zeilenindex erstellen
df = pd.DataFrame({
'year': [2023, 2023, 2023, 2023, 2024, 2024, 2024, 2024],
'quarter': ['Q1', 'Q1', 'Q2', 'Q2', 'Q1', 'Q1', 'Q2', 'Q2'],
'product': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
'sales': [100, 150, 200, 180, 220, 250, 230, 270]
})
print("=== Originaldaten ===")
print(df)
# 2. Den mehrstufigen Index einrichten
df_indexed = df.set_index(['year', 'quarter', 'product'])
print("n=== Nach dem Einrichten des mehrstufigen Index ===")
print(df_indexed)
# 3. Innerste Ebene entstapeln (Produkt, Standardwert level=-1)
print("n=== Entstapelte Produktebene (Standard) ===")
unstacked_inner = df_indexed.unstack()
print(unstacked_inner['sales'])
# 4. Mittlere Ebene entstapeln (Quartal)
print("n=== Entstapelte Quartalsebene ===")
unstacked_quarter = df_indexed.unstack(level='quarter')
print(unstacked_quarter['sales'])
# 5. Äußere Ebene entstapeln (Jahr)
print("n=== Entstapelte Jahresebene ===")
unstacked_year = df_indexed.unstack(level='year')
print(unstacked_year['sales'])
# 6. Mehrere Ebenen gleichzeitig entstapeln
print("n=== Jahr und Produkt zusammen entstapelt ===")
unstacked_multi = df_indexed.unstack(level=['year', 'product'])
print(unstacked_multi['sales'])
Erwartete Ausgabe:
=== 原始数据 ===
year quarter product sales
0 2023 Q1 A 100
1 2023 Q1 B 150
2 2023 Q2 A 200
3 2023 Q2 B 180
4 2024 Q1 A 220
5 2024 Q1 B 250
6 2024 Q2 A 230
7 2024 Q2 B 270
n=== 设置多层索引 ===
sales
year quarter product
2023 Q1 A 100
B 150
Q2 A 200
B 180
2024 Q1 A 220
B 250
Q2 A 230
B 270
n=== 展开 product 层(默认)===
product A B
year quarter
2023 Q1 100 150
Q2 200 180
2024 Q1 220 250
Q2 230 270
n=== 展开 quarter 层 ===
quarter Q1 Q2
year product
2023 A 100 200
B 150 180
2024 A 220 230
B 250 270
n=== 展开 year 层 ===
year 2023 2024
quarter product
Q1 A 100 220
B 150 250
Q2 A 200 230
B 180 270
n=== 同时展开 year 和 product ===
year 2023 2024
product A B A B
quarter
Q1 100 150 220 250
Q2 200 180 230 270
Code-Erklärung:
- Für einen DataFrame mit einem Multi-Level-Index kann man den
levelParameter verwenden, um festzulegen, welche Ebene entstapelt werden soll. - Standardmäßig,
level=-1die innerste Ebene (product) wird entstapelt. - Das Entstapeln verschiedener Ebenen erzeugt unterschiedliche Datenlayouts, wodurch sich die Daten bequem aus verschiedenen Perspektiven analysieren lassen.
Beispiel 3: Umgang mit fehlenden Werten mit fill_value
Verwenden Sie diefill_valueParameter zum Auffüllen fehlender Werte, die nach dem Entstapeln entstehen.
Beispiel
import numpy as np
# 1. Unvollständige Daten erstellen (nicht alle product-region-Kombinationen enthalten Daten)
df = pd.DataFrame({
'product': ['A', 'A', 'B', 'C'],
'region': ['North', 'South', 'North', 'East'],
'sales': [100, 150, 200, 220]
})
print("=== Ursprüngliche Daten (unvollständig) ===")
print(df)
# 2. Einen hierarchischen Index erstellen und unstack anwenden
df_indexed = df.set_index(['product', 'region'])
print("n=== Hierarchischer Index ===")
print(df_indexed)
# 3. Fehlende Werte nicht auffüllen
print("n=== Ohne Auffüllen fehlender Werte ===")
unstacked = df_indexed.unstack()
print(unstacked)
print(f"nAnzahl fehlender Werte: {unstacked['sales'].isna().sum().sum()}")
# 4. fill_value=0 verwenden, um fehlende Werte aufzufüllen
print("n=== fill_value=0 ===")
unstacked_fill = df_indexed.unstack(fill_value=0)
print(unstacked_fill)
print(f"nAnzahl fehlender Werte: {unstacked_fill['sales'].isna().sum().sum()}")
Erwartete Ausgabe:
=== 原始数据(不完整)===
product region sales
0 A North 100
1 A South 150
2 B North 200
3 C East 220
n=== 层次化索引 ===
sales
product region
A North 100
South 150
B North 200
C East 220
n=== 不填充缺失值 ===
sales
region East North South
product
A NaN 100.0 150.0
B NaN 200.0 NaN
C 220.0 NaN NaN
缺失值数量: 5
n=== fill_value=0 ===
sales
region East North South
product
A 0 100 150
B 0 200 0
C 220 0 0
缺失值数量: 0
Code-Erklärung:
- Wenn die Ausgangsdaten unvollständig sind, erzeugt unstack fehlende Werte (NaN).
- Mit der
fill_valueMit dem Parameter können Sie einen Füllwert angeben, um Fehler bei nachfolgenden Berechnungen zu vermeiden. - Es wird normalerweise mit 0 gefüllt, um "keine Daten" oder "diese Kombination existiert nicht" anzuzeigen.
Beispiel 4: Kombinieren von unstack und stack
unstack()undstack()Sie sind Umkehroperationen; ihre gemeinsame Verwendung ermöglicht flexibles Umformen von Daten.
Beispiel
# 1. Initiale Daten im Breitformat erstellen
df = pd.DataFrame({
'product': ['A', 'B', 'C'],
'North': [100, 150, 200],
'South': [180, 170, 160],
'East': [190, 200, 210]
})
print("=== Originale Breitformat-Daten ===")
print(df)
# 2. Zuerst stack verwenden, um in Langformat zu konvertieren
print("n=== Schritt 1: stack konvertiert in Langformat ===")
stacked = df.set_index('product').stack()
print(stacked)
# 3. Dann unstack zurück (Umkehrbarkeit überprüfen)
print("n=== Schritt 2: unstack konvertiert zurück in Breitformat ===")
restored = stacked.unstack()
print(restored)
# 4. Praktisch: Die Daten neu anordnen
print("n=== Praktisch: Region in Spalten verschieben ===")
# Original: product als Zeilenindex, region als Spalten
# Ziel: region als Zeilenindex, product als Spalten
result = df.set_index('product').unstack().unstack(level=-1)
print(result)
# 5. Verwende reorder_levels, um die Reihenfolge der Ebenen anzupassen
print("n=== reorder_levels zum Anpassen der Ebenen verwenden ===")
# Einen zweistufigen Index erstellen
df_multi = pd.DataFrame(
[[100, 200], [150, 180], [190, 210]],
index=pd.MultiIndex.from_tuples([
('A', 'North'), ('B', 'North'), ('C', 'North')
], names=['product', 'region']),
columns=['2023', '2024']
)
print("Originaldaten:")
print(df_multi)
# Die Reihenfolge der Ebenen anpassen
print("nNach Anpassung (Jahr auf der äußeren Ebene):")
print(df_multi.unstack(level='region'))
Erwartete Ausgabe:
=== 原始宽格式数据 === product North South East 0 A 100 180 190 1 B 150 170 ...
Code-Erklärung:
stack()undunstack()Sie sind ein Paar inverser Operationen.- Wenn man zuerst stack und dann unstack anwendet, kann theoretisch die ursprüngliche Form wiederhergestellt werden (unter Vernachlässigung von Unterschieden bei Füllwerten).
- Durch verschiedene Kombinationen von Ebenen können unterschiedliche Datenlayouts erreicht werden.
- In der tatsächlichen Datenanalyse ist es oft notwendig, die Datenform wiederholt anzupassen, um unterschiedliche Analyseanforderungen zu erfüllen.
Andere ErweiterungenTipp:
unstack()undstack()Es ist ein Kernwerkzeug für die Datenumformung.unstack()Es "entpackt" Zeilen in Spalten (von lang nach breit),stack()Es "stapelt" Spalten in Zeilen (von breit nach lang).
Pandas Häufige Funktionen