Ce face pd.melt() / DataFrame.melt()
Multe tabele vin în format lat: câte o coloană pentru fiecare lună sau an. Pentru grupare, filtrare sau grafice e mai comod formatul lung: o coloană cu numele lunii și una cu valoarea. melt() face această transformare.
id_vars sunt coloanele care rămân cum sunt (de exemplu orașul); value_vars sunt coloanele „topite” în rânduri (dacă lipsește, se iau toate celelalte). var_name și value_name dau numele celor două coloane noi; implicit ele se numesc variable și value.
Operația inversă este pivot(). pd.melt(df, ...) și df.melt(...) fac același lucru.
Parametri
| Parametru | Descriere |
|---|---|
id_vars |
Coloanele care identifică rândul și rămân neschimbate. |
value_vars |
Coloanele transformate în rânduri. Implicit toate coloanele care nu sunt în id_vars. |
var_name |
Numele coloanei noi care primește vechile nume de coloane. Implicit variable. |
value_name |
Numele coloanei noi cu valorile. Implicit value. |
ignore_index |
True (implicit): rezultatul primește un index nou 0, 1, 2… |
Ce returnează
Un DataFrame nou, în format lung.
Exemple
Exemplul 1: Vânzări pe luni, din lat în lung
2 orașe × 3 luni = 6 rânduri.
import pandas as pd
lat = pd.DataFrame({"oras": ["Iași", "Cluj"],
"ian": [100, 150], "feb": [120, 130], "mar": [90, 170]})
lung = lat.melt(id_vars="oras", var_name="luna", value_name="lei")
print(lung)
Rezultat
oras luna lei
0 Iași ian 100
1 Cluj ian 150
2 Iași feb 120
3 Cluj feb 130
4 Iași mar 90
5 Cluj mar 170
Exemplul 2: Doar unele coloane, cu value_vars
import pandas as pd
note = pd.DataFrame({"elev": ["Ana", "Mihai"], "clasa": ["9A", "9B"],
"romana": [9, 7], "mate": [8, 10], "sport": [10, 10]})
print(pd.melt(note, id_vars=["elev", "clasa"], value_vars=["romana", "mate"],
var_name="materie", value_name="nota"))
Rezultat
elev clasa materie nota
0 Ana 9A romana 9
1 Mihai 9B romana 7
2 Ana 9A mate 8
3 Mihai 9B mate 10
Exemplul 3: Formatul lung ușurează gruparea
import pandas as pd
lat = pd.DataFrame({"oras": ["Iași", "Cluj", "Brașov"],
"ian": [100, 150, 80], "feb": [120, 130, 95]})
lung = lat.melt(id_vars="oras", var_name="luna", value_name="lei")
print(lung.groupby("luna")["lei"].sum())
Rezultat
luna
feb 345
ian 330
Name: lei, dtype: int64
Greșeli frecvente
- Uiți
id_vars: și coloana cu orașul este topită în rânduri, iar legătura dintre oraș și valori se pierde. - Nu dai
var_name/value_nameși rămâi cu coloane numitevariableșivalue, greu de citit mai târziu. - Topești coloane cu tipuri diferite (text și numere) în aceeași coloană
value; tipul ei devine amestecat. Alege cuvalue_varsdoar coloanele de același fel.
Comenzi înrudite
DataFrame.pivot(): Rearanjează un tabel lung într-unul lat: valorile unei coloane devin nume de coloane, fără calcule de agregare.pd.pivot_table(): Creează un tabel pivot ca în Excel: rânduri după o coloană, coloane după alta și o valoare agregată (sumă, medie) în fiecare celulă.DataFrame.groupby(): Împarte tabelul în grupuri după una sau mai multe coloane, ca să calculezi totaluri, medii sau numărări pentru fiecare grup.pd.DataFrame(): Creează un tabel cu rânduri și coloane, dintr-un dicționar de liste, dintr-o listă de dicționare sau dintr-o listă de liste.
Întrebări & Exemple de Cod:
pd.melt() / DataFrame.melt()Ai o nelămurire despre utilizarea comenzii
pd.melt() / DataFrame.melt()sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.