Pandas pd.melt()-Funktion
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
# 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:
- Die Originaldaten liegen im breiten Format vor, jede Zeile entspricht einer Person, und Q1, Q2, Q3 sind Umsatzdaten-Spalten für drei Quartale.
id_vars=['name']Geben Sie die Namensspalte an, die als Bezeichner unverändert bleiben soll.value_vars=['Q1_sales', 'Q2_sales', 'Q3_sales']Geben Sie die Spalten an, die geschmolzen werden sollen.- Das Ergebnis fügt eine Variablenspalte (die ursprüngliche Spaltennamen speichert) und eine Wertspalte (die entsprechende Werte speichert) hinzu.
- Verwendung
var_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
# 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
# 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.
- Verwendung
ignore_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
# 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.
- Verwendung
id_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
# 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.
Weitere ErweiterungenTipp:
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 Funktionen