Pandas df.stack() Funktion

Pandas 常用函数Pandas Häufige Funktionen


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 pandas as pd
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:

  1. Die ursprünglichen Daten liegen im breiten Format vor, wobei Q1, Q2, Q3 drei Spalten mit Quartalsdaten sind.
  2. stack()Die drei Spalten Q1, Q2, Q3 werden in Zeilen "gestapelt".
  3. 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).
  4. 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 pandas as pd
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 pandas as pd
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 Siereset_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

import pandas as pd

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

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

Andere Erweiterungen