melt: van breed naar lang formaat
Converteer een breed DataFrame naar een lang formaat met pd.melt en specificeer id_vars en value_vars.
melt: van breed naar lang formaat is een gratis Pandas & NumPy Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Pandas & NumPy Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.
Gegevensformaten: breed versus lang
Gegevens kunnen in twee fundamentele vormen worden gestructureerd. In breed formaat staat er één rij per onderwerp en zijn metingen verdeeld over meerdere kolommen, bijvoorbeeld aparte kolommen voor de verkopen in januari, februari en maart. In lang formaat staat er één rij per waarneming, met één kolom voor de variabelenaam en een andere voor de waarde. De meeste analysefuncties van Pandas, bibliotheken voor machine learning en visualisatietools geven de voorkeur aan lang formaat, waardoor melt() een onmisbaar hulpmiddel voor transformaties is.
De functie pd.melt()
pd.melt(df) (ook beschikbaar als df.melt()) zet een brede DataFrame om naar lang formaat. De belangrijkste parameters zijn id_vars (kolommen die ongewijzigd als identificatie worden behouden), value_vars (kolommen die naar rijen worden omgezet), var_name (naam voor de nieuwe variabelekolom) en value_name (naam voor de nieuwe waardekolom).
import pandas as pd
# Wide format: separate columns per month
df_wide = pd.DataFrame({
'product': ['A', 'B'],
'Jan': [100, 150],
'Feb': [120, 130],
'Mar': [140, 160]
})
print(df_wide)
# product Jan Feb Mar
# 0 A 100 120 140
# 1 B 150 130 160Een basisaanroep van melt()
Roep melt() aan met id_vars ingesteld op de kolommen die je als identificatie wilt behouden. Elke andere kolom wordt omgezet: de naam wordt een waarde in de nieuwe variabelekolom en de celwaarden worden naar de waardekolom verplaatst. Het aantal uitvoerrijen is gelijk aan het aantal invoerrijen vermenigvuldigd met het aantal waarde-kolommen dat wordt omgezet.
df_long = df_wide.melt(
id_vars='product',
var_name='month',
value_name='sales'
)
print(df_long)
# product month sales
# 0 A Jan 100
# 1 B Jan 150
# 2 A Feb 120
# 3 B Feb 130
# 4 A Mar 140
# 5 B Mar 160Kiezen welke kolommen worden omgezet
Standaard wordt elke kolom die niet in id_vars staat omgezet. Gebruik value_vars om alleen een deelverzameling van de kolommen om te zetten. Kolommen die niet in id_vars of value_vars staan, worden uit het resultaat verwijderd. Dit is handig wanneer je brede DataFrame een combinatie bevat van tijdreeks- en andere kenmerken die je niet naar rijen wilt omzetten.
df_wide2 = pd.DataFrame({
'product': ['A', 'B'],
'category': ['Electronics', 'Clothing'],
'Jan': [100, 150],
'Feb': [120, 130],
'Mar': [140, 160]
})
# Melt only Jan and Feb, keep product and category
df_long2 = df_wide2.melt(
id_vars=['product', 'category'],
value_vars=['Jan', 'Feb'],
var_name='month',
value_name='sales'
)
print(df_long2)De index resetten na melt()
melt() behoudt de oorspronkelijke rij-indexen door ze voor elke variabele te herhalen. Het resultaat heeft vaak een niet-opeenvolgende index, zoals [0, 1, 0, 1, 0, 1]. Het is een goede gewoonte om direct na melt() reset_index(drop=True) aan te roepen, zodat de uitvoer een nette opeenvolgende index van 0 tot en met n-1 krijgt.
df_long = df_wide.melt(id_vars='product', var_name='month', value_name='sales')
print('Before reset:', df_long.index.tolist())
# [0, 1, 0, 1, 0, 1]
df_long = df_long.reset_index(drop=True)
print('After reset:', df_long.index.tolist())
# [0, 1, 2, 3, 4, 5]melt() is het omgekeerde van pivot()
melt() is conceptueel het omgekeerde van pivot() / pivot_table(). Je kunt met pivot_table() van lang naar breed gaan en met melt() van breed weer naar lang. Deze heen-en-terugtransformatie wordt vaak gebruikt in verwerkingspijplijnen: ontvang gegevens in breed formaat, vorm ze om naar lang formaat voor visualisaties met Seaborn of ML-kenmerken en draai ze eventueel weer terug voor een rapportagetabel.
# long -> wide
table = df_long.pivot_table(values='sales', index='product',
columns='month', aggfunc='sum')
print(table)
# product Feb Jan Mar
# A 120 100 140
# B 130 150 160
# wide -> long again
long_again = table.reset_index().melt(id_vars='product', var_name='month', value_name='sales')
print(long_again.head())melt() gebruiken voor visualisaties met Seaborn
De categorische en relationele grafieken van Seaborn werken het best met gegevens in lang formaat. Een gebruikelijke werkwijze is: begin met een DataFrame in breed formaat met één kolom per groep, zet dit om naar lang formaat zodat één kolom de groep aanduidt en een andere kolom de waarden bevat, en geef beide vervolgens door aan de parameters hue en x/y van Seaborn. Dit is een van de meest voorkomende redenen om melt() te gebruiken.
import seaborn as sns
import matplotlib.pyplot as plt
# Long format is required for sns.lineplot with hue
df_long = df_wide.melt(id_vars='product', var_name='month', value_name='sales')
# sns.lineplot(data=df_long, x='month', y='sales', hue='product')
# plt.show()
print('Long data ready for Seaborn:')
print(df_long)De uitvoerkolommen benoemen
Standaard geeft melt() de nieuwe variabelekolom de naam 'variable' en de waardekolom de naam 'value'. Overschrijf deze namen altijd met betekenisvolle namen via var_name en value_name. Beschrijvende kolomnamen maken daaropvolgende code leesbaarder en voorkomen verwarring wanneer een DataFrame tientallen kolommen heeft.
# Default: generic column names 'variable' and 'value'
default = df_wide.melt(id_vars='product')
print(default.columns.tolist())
# ['product', 'variable', 'value']
# Better: descriptive names
good = df_wide.melt(id_vars='product', var_name='month', value_name='revenue_usd')
print(good.columns.tolist())
# ['product', 'month', 'revenue_usd']Enquêtegegevens omzetten naar lang formaat
Een klassiek gebruiksscenario voor melt() zijn enquêteantwoorden waarbij elke kolom een vraag bevat en elke rij een respondent. Door de gegevens om te zetten, verander je dit brede formaat in een lang formaat met kolommen voor de respondent-ID, de vraagnaam en de antwoordwaarde. Daarna kun je met groupby() eenvoudig de verdeling van de antwoorden per vraag berekenen.
survey = pd.DataFrame({
'respondent': [1, 2, 3],
'Q1_rating': [5, 3, 4],
'Q2_rating': [4, 5, 3],
'Q3_rating': [2, 4, 5]
})
long = survey.melt(id_vars='respondent', var_name='question', value_name='rating')
print(long)
print(long.groupby('question')['rating'].mean())Het resultaat na het omzetten sorteren
Na het omzetten zijn de rijen geordend volgens de oorspronkelijke kolomvolgorde (Jan, Feb, Mar voor elke rij). Vaak wil je eerst op de identificatiekolom sorteren en daarna op de variabelekolom. Gebruik sort_values() op het DataFrame na het omzetten om de volgorde te krijgen die het meest logisch is voor je analyse of verdere verwerking.
df_long = df_wide.melt(id_vars='product', var_name='month', value_name='sales')
# Sort by product, then month
df_sorted = df_long.sort_values(['product', 'month']).reset_index(drop=True)
print(df_sorted)
# product month sales
# 0 A Feb 120
# 1 A Jan 100
# 2 A Mar 140
# 3 B Feb 130
# 4 B Jan 150
# 5 B Mar 160melt() in een gegevensverwerkingspijplijn
In een typische gegevensverwerkingspijplijn staat melt() direct na het inladen of opschonen van gegevens in breed formaat, en vóór elke analyse- of modelleringsstap. Plaats deze bewerking vroeg in je pijplijn om snel naar lang formaat te gaan. Daarna werken alle volgende bewerkingen (groupby, seaborn, sklearn) met de schone gegevens in lang formaat, zonder uitzonderingslogica.
def load_and_reshape(filepath):
raw = pd.read_csv(filepath)
# Melt all month columns into long format
month_cols = [c for c in raw.columns if c.startswith('month_')]
long = raw.melt(
id_vars=[c for c in raw.columns if c not in month_cols],
value_vars=month_cols,
var_name='month',
value_name='value'
)
return long.reset_index(drop=True)Korte controle
Test je begrip van de omzetting van breed naar lang met pd.melt uit deze les.
Samenvatting van de les
In deze les heb je geleerd dat melt() breed formaat omzet naar lang formaat door kolommen om te zetten in rijen; dat id_vars bepaalt welke kolommen vast blijven staan en value_vars selecteert welke kolommen worden omgezet; dat var_name en value_name beschrijvende namen geven aan de nieuwe kolommen; en dat lang formaat de voorkeur heeft voor Seaborn, groupby en ML-pijplijnen. Hierna bekijken we stack en unstack voor het hervormen van MultiIndex-DataFrames.
Leer Python met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 30
- Lessen
- 120
Veelgestelde vragen
Is de les “melt: van breed naar lang formaat” gratis?
Ja — de volledige tekst van “melt: van breed naar lang formaat” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Pandas & NumPy Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.
Wat leer ik in “melt: van breed naar lang formaat”?
Converteer een breed DataFrame naar een lang formaat met pd.melt en specificeer id_vars en value_vars. Je oefent met Pandas & NumPy Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Pandas & NumPy Academy te beginnen?
Ervaring vooraf is niet nodig. Pandas & NumPy Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “melt: van breed naar lang formaat”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Pandas & NumPy Academy?
Ja. Elke les over Pandas & NumPy Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- pivot_table: kruistabellen
- melt: van breed naar lang formaat
- stack en unstack met MultiIndex
- crosstab voor frequentietabellen