Pandas pd.melt()-Funktion

Pandas 常用函数Pandas Häufige Funktionen


pd.melt()ist eine Top-Level-Funktion der Pandas-Bibliothek, mit der maneine breite Tabelle in eine lange Tabelle umwandeltSie „schmilzt“ Daten im Breitformat mit mehreren Spalten in das Langformat, ähnlich der Unpivot-Operation in Excel.

Dies ist eine der am häufigsten verwendeten Funktionen bei der Datenumformung, besonders nützlich, wenn Daten vor der Datenvisualisierung in das Langformat umgewandelt werden müssen oder wenn mehrere Spalten zu einer Spalte zusammengefasst werden müssen.

Wortdefinition: meltEs bedeutet „schmelzen, verschmelzen“; hier bezieht es sich darauf, die Struktur einer breiten Tabelle in die Struktur einer langen Tabelle zu „schmelzen“, ähnlich dem Zusammenführen mehrerer Datenspalten.


Grundlegende Syntax und Parameter

pd.melt()ist eine Top-Level-Funktion der Pandas-Bibliothek, mit der Daten im Breitformat in das Langformat umgewandelt werden.

Syntaxformat

pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)

Parameterbeschreibung

  • Parameter: frame
    • Typ: DataFrame.
    • Beschreibung:Erforderlicher Parameter. Das Quell-DataFrame, d. h. die Daten, die von breit nach lang umgewandelt werden sollen.
  • Parameter: id_vars
    • Typ: Spaltenname, Tupelliste oder None.
    • Beschreibung: Spalten, die als Identifikator-(ID-)Variablen verwendet werden; diese Spalten bleiben nach der Umwandlung unverändert. Kann ein einzelner Spaltenname oder eine Liste von Spaltennamen sein. Wenn nicht angegeben, werden alle Spalten als value_vars behandelt.
  • Parameter: value_vars
    • Typ: Spaltenname, Tupelliste oder None.
    • Beschreibung: Die Spalten, die „geschmolzen“ werden sollen, d. h. welche Spalten in Zeilen umgewandelt werden. Wenn nicht angegeben, werden alle Spalten außer id_vars umgewandelt.
  • Parameter: var_name
    • Typ: String oder None.
    • Beschreibung: Der neue Spaltenname, der zum Speichern der ursprünglichen Spaltennamen generiert wird. Standardwert ist 'variable'.
  • Parameter: value_name
    • Typ: string.
    • Beschreibung: Der Name der generierten Wertspalte. Standard ist 'value'.
  • Parameter: col_level
    • Typ: int, str oder None.
    • Beschreibung: Wenn die Spalten ein MultiIndex sind, geben Sie die Ebene zum Umschmelzen an.

Funktionsbeschreibung

  • Rückgabewert: Gibt ein DataFrame zurück, wobei die Daten vom breiten Format ins lange Format konvertiert werden.
  • Wirkung: Schmilzt die Werte mehrerer Spalten in zwei Spalten um: eine Spalte speichert die ursprünglichen Spaltennamen (variable) und eine Spalte speichert die entsprechenden Werte (value).

Beispiele

Lassen Sie uns durch eine Reihe von Beispielen von einfach bis komplex gründlich meistern,pd.melt()die Verwendung von.

Beispiel 1: Grundlegende Verwendung - Eine einfache breite Tabelle in eine lange Tabelle umwandeln

Beispiele

import pandas as pd

# 1. Breitformat-Daten erstellen (eine Spalte pro Quartal)
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'Q1_sales': [100, 150, 200],
    'Q2_sales': [120, 160, 210],
    'Q3_sales': [130, 170, 220]
})

print("=== Originale Breitformat-Daten ===")
print(df)

# 2. pd.melt() verwenden, um in das lange Format zu konvertieren
melted = pd.melt(df, id_vars=['name'], value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales'])
print("\n=== pd.melt() in langes Format konvertiert ===")
print(melted)

# 3. Benutzerdefinierte Spaltennamen
melted_custom = pd.melt(
    df,
    id_vars=['name'],
    value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales'],
    var_name='quarter',
    value_name='sales'
)
print("\n=== Benutzerdefinierte Spaltennamen ===")
print(melted_custom)

Erwartete Ausgabe:

=== 原始宽格式数据 ===
      name  Q1_sales  Q2_sales  Q3_sales
0    Alice      100      120      130
1     Bob      150      160      170
2  Charlie      200      210      220

=== pd.melt() 转换为长格式 ===
      name    variable  value
0    Alice   Q1_sales    100
1     Bob   Q1_sales    150
2  Charlie  Q1_sales    200
3    Alice   Q2_sales    120
4     Bob   Q2_sales    160
5  Charlie  Q2_sales    210
6    Alice   Q3_sales    130
7     Bob   Q3_sales    170
8  Charlie  Q3_sales    220

=== 自定义列名 ===
      name  quarter  sales
0    Alice  Q1_sales    100
1     Bob  Q1_sales    150
2  Charlie  Q1_sales    200
3    Alice  Q2_sales    200

Codeanalyse:

  1. Die Originaldaten liegen im breiten Format vor, jede Zeile entspricht einer Person, und Q1, Q2, Q3 sind Umsatzdaten-Spalten für drei Quartale.
  2. id_vars=['name']Geben Sie die Namensspalte an, die als Bezeichner unverändert bleiben soll.
  3. value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales']Geben Sie die Spalten an, die geschmolzen werden sollen.
  4. Das Ergebnis fügt eine Variablenspalte (die ursprüngliche Spaltennamen speichert) und eine Wertspalte (die entsprechende Werte speichert) hinzu.
  5. Verwendungvar_nameundvalue_nameDie Namen der neuen Spalten können angepasst werden.

Beispiel 2: Ohne Angabe von value_vars – Alle Spalten außer id_vars schmelzen

Wenn value_vars nicht angegeben wird, werden alle Spalten außer id_vars automatisch geschmolzen.

Beispiele

import pandas as pd

# 1. Daten mit mehr Spalten erstellen
df = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie'],
    'math': [90, 85, 92],
    'english': [88, 90, 87],
    'science': [95, 88, 91]
})

print("=== Originaldaten ===")
print(df)

# 2. Nur id_vars angeben, alle anderen Spalten automatisch schmelzen
melted = pd.melt(df, id_vars=['id', 'name'])
print("\n=== Alle Nicht-ID-Spalten schmelzen ===")
print(melted)

# 3. Fall mit mehreren id_vars
print("\n=== Mehrere id_vars ===")
melted_multi = pd.melt(df, id_vars=['name'], value_vars=['math', 'english', 'science'])
print(melted_multi)

# 4. Nur ein id_vars verwenden
print("\n=== Ein id_vars ===")
melted_one = pd.melt(df, id_vars=['id'])
print(melted_one)

Erwartete Ausgabe:

=== 原始数据 ===
   id     name  math  english  science
0   1    Alice     90      88      95
1   2     Bob     85      90      88
2   3  Charlie    92      87      91

=== 融化所有非id列 ===
   id     name   variable  value
0   1    Alice      math     90
1   2       Bob     math     85
2   3  Charlie    math     92
3   1    Alice   english     88
4   2       融化为两列(variable 和 value)。

- 不指定 value_vars 时,系统会自动识别并熔化除 id_vars 外的所有列
- id_vars 可以是单个列或多个列的组合

Codeanalyse:

  • Wenn nicht angegeben,value_varses wird automatisch umgeformtid_varsalle Spalten außer id_vars.
  • Wenn nur id_vars angegeben ist und value_vars nicht, erzeugt jede Datenzeile so viele neue Zeilen, wie value_vars vorhanden sind.
  • Diese Methode ist sehr praktisch, wenn Sie mehrspaltige Daten einheitlich verarbeiten müssen.

Beispiel 3: Keine id_vars - Alle Spalten umformen

Wenn id_vars nicht angegeben ist, dient der Index der Originaldaten als Identifikator.

Beispiele

import pandas as pd

# 1. Daten erstellen (ohne explizite id-Spalte)
df = pd.DataFrame({
    'Q1': [100, 150, 200],
    'Q2': [120, 160, 210],
    'Q3': [130, 170, 220]
})

print("=== Originaldaten ===")
print(df)

# 2. id_vars nicht angeben, den Standardindex verwenden
melted = pd.melt(df)
print("\n=== Without specifying id_vars ===")
print(melted)

# 3. Den ursprünglichen Index wiederherstellen
print("\n=== Reset index ===")
melted_with_index = pd.melt(df, ignore_index=False)
print(melted_with_index)

# 4. Praktischer Fall: eine Kennung erstellen
df_with_id = pd.DataFrame({
    'year': [2023, 2023, 2023],
    'Q1': [100, 150, 200],
    'Q2': [120, 160, 210]
})
print("\n=== Originaldaten (mit Jahr) ===")
print(df_with_id)

# Zuerst year zu id_vars hinzufügen
melted_year = pd.melt(df_with_id, id_vars=['year'])
print("\n=== Melt-Ergebnis inklusive Jahr ===")
print(melted_year)

Erwartete Ausgabe:

=== 原始数据 ===
     Q1   Q2   Q3
0  100  120  130
1  150  160  170
2  200  210  220

=== 不指定 id_vars ===
   variable  value
0        Q1    100
1        Q1    150
2        融化所有列,将原始列名转为 variable 列的值,原始值转为 value 列。

Codeanalyse:

  • Wenn id_vars nicht angegeben ist, bleiben nur die Spalten variable und value übrig.
  • Verwendungignore_index=Falsekann den ursprünglichen Index beibehalten, was einen späteren Vergleich mit den Originaldaten erleichtert.
  • In der Praxis werden üblicherweise ein oder mehrere id_vars angegeben, um wichtige Informationen beizubehalten.

Beispiel 4: Praktischer Fall – Vorbereitung für die Datenvisualisierung

melt() ist eine großartige Hilfe für die Datenvisualisierung; viele Plot-Bibliotheken (wie Seaborn, Matplotlib) sind besser für die Verarbeitung von Daten im Long-Format geeignet.

Beispiele

import pandas as pd

# 1. Verkaufsdaten erstellen (eine Spalte pro Region)
sales = pd.DataFrame({
    'product': ['A', 'B', 'C', 'D'],
    'Jan': [1200, 1500, 900, 1100],
    'Feb': [1350, 1600, 950, 1200],
    'Mar': [1100, 1450, 880, 1050]
})

print("=== Verkaufsdaten im Wide-Format ===")
print(sales)

# 2. In Long-Format umwandeln (für die Visualisierung)
sales_long = pd.melt(
    sales,
    id_vars=['product'],
    var_name='month',
    value_name='sales'
)

print("\n=== Verkaufsdaten im Langformat ===")
print(sales_long)

# 3. Datenverarbeitungsbeispiel: Jahr-über-Jahr-Wachstum berechnen
# Monatsnummer hinzufügen
month_map = {'Jan': 1, 'Feb': 2, 'Mar': 3}
sales_long['month_num'] = sales_long['month'].map(month_map)

print("\n=== Monatsnummer hinzufügen ===")
print(sales_long)

# 4. Daten für einen bestimmten Monat filtern
feb_sales = sales_long[sales_long['month'] == 'Feb']
print("\n=== Verkaufsdaten für Februar ===")
print(feb_sales)

Erwartete Ausgabe:

=== 宽格式销售数据 ===
  product   Jan   Feb   Mar
0       A  1200  1350  1100
product  Jan  180  170   6

=== 长格式销售数据(用于可视化) ===
   product month  sales
0       A   Jan  1200
1       B   Jan  1500
2       C   Jan   900
3       D   Jan  1100
4       A   Feb  1350

Codeanalyse:

  • Wide-Format-Daten haben eine Spalte pro Region/Zeitpunkt, was das Anzeigen und Eingeben von Daten erleichtert.
  • Long-Format-Daten haben eine Zeile pro Beobachtung, was das Standardformat für statistische Analysen ist.
  • Visualisierungsbibliotheken wie Seaborn akzeptieren Long-Format-Daten, wodurch sich gruppierte Balkendiagramme, Liniendiagramme usw. einfach erstellen lassen.
  • Verwendungid_varskann kategoriale Variablen wie Produkt und Region vom Umformen ausnehmen.

Beispiel 5: Umformen mit mehrstufigem Spaltenindex

Wenn ein DataFrame einen mehrstufigen Spaltenindex hat, können Siecol_levelden Parameter.

Beispiele

import pandas as pd

# 1. Daten mit einem mehrstufigen Spaltenindex erstellen
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=['Category', 'Quarter'])
)

print("=== Originaldaten (mehrstufiger Spaltenindex) ===")
print(df)

# 2. Alle Spalten umformen (ohne Angabe einer Ebene)
print("\n=== Alle Spalten umformen ===")
melted_all = pd.melt(df, ignore_index=False)
print(melted_all)

# 3. Nur die innere Ebene umformen (Quarter)
print("\n=== Nur die Quarter-Ebene melt ===")
melted_quarter = pd.melt(df, col_level=1)
print(melted_quarter)

# 4. Die äußere Ebene (Category) melt
print(n=== Nur die Category-Ebene melt ===)
melted_category = pd.melt(df, col_level=0)
print(melted_category)

Erwartete Ausgabe:

=== 原始数据(多层列索引)===
Category      Electronics   Furniture
Quarter              Q1   Q2      Q1   融化不同层级会产生不同的结果:
- 融化内层(Quarter)保留 Category 作为 id
- 融化外层(Category)保留 Quarter 作为 id

Code-Erklärung:

  • Bei einem DataFrame mit einem mehrstufigen Spaltenindex liegen Spaltennamen in Tupelform vor: (Category, Quarter).
  • col_level=0Die äußere Ebene (Category) melt, Quarter als id beibehalten.
  • col_level=1Die innere Ebene (Quarter) melt, Category als id beibehalten.
  • Diese Flexibilität ermöglicht es Ihnen, je nach Analysebedarf auszuwählen, welche Ebene gemeltet werden soll.

Tipp: pd.melt()Es ist eine großartige Hilfe für die Datenvisualisierung. Die meisten Plotting-Bibliotheken (z. B. Seaborn, Plotnine) kommen mit Daten im Long-Format besser zurecht; melt() zu verwenden, um Daten vor dem Plotten zu transformieren, ist eine gängige Praxis.

Pandas 常用函数Häufige Pandas-Funktionen

Weitere Erweiterungen