Pandas df.unstack()-Funktion

Pandas 常用函数Pandas Häufige Funktionen


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

import pandas as pd

# 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:

  1. Die ursprünglichen Daten liegen im langen Format vor, wobei jede Zeile den Verkaufsbetrag eines Produkts in einer Region erfasst.
  2. Verwenden Sieset_index()um einen hierarchischen Index zu erstellen (Produkt als äußere Ebene, Region als innere Ebene).
  3. unstack()Die innere Indexregion wird an die Spaltenposition verschoben.
  4. 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

import pandas as pd

# 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 denlevelParameter 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 pandas as pd
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 derfill_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

import pandas as pd

# 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.

Tipp: 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 常用函数Pandas Häufige Funktionen

Andere Erweiterungen