melt: leveästä pitkäksi muodoksi
Muuntaa leveä DataFrame pitkäksi muodoksi pd.melt-funktiolla ja määrittäkää id_vars- sekä value_vars-parametrit.
melt: leveästä pitkäksi muodoksi on ilmainen Pandas & NumPy Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Pandas & NumPy Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.
Leveä ja pitkä tietomuoto
Tiedot voidaan jäsentää kahdella perustavanlaatuisella tavalla. Leveässä muodossa on yksi rivi kohdetta kohti, ja mittaukset on jaettu useisiin sarakkeisiin — esimerkiksi tammikuun, helmikuun ja maaliskuun myynnille on omat sarakkeensa. Pitkässä muodossa on yksi rivi havaintoa kohti: yhdessä sarakkeessa on muuttujan nimi ja toisessa sen arvo. Useimmat Pandasin analyysifunktiot, koneoppimiskirjastot ja visualisointityökalut suosivat pitkää muotoa, joten melt() on olennainen muunnostyökalu.
pd.melt()-funktio
pd.melt(df) (saatavana myös muodossa df.melt()) muuntaa leveän DataFramen pitkäksi. Keskeiset parametrit ovat id_vars (tunnisteina säilytettävät sarakkeet muuttumattomina), value_vars (riveiksi purettavat sarakkeet), var_name (uuden muuttujasarakkeen nimi) ja value_name (uuden arvosarakkeen nimi).
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 160Peruskutsu melt()-funktiolle
Kutsukaa melt()-funktiota ja asettakaa id_vars-parametrin arvoksi sarakkeet, jotka haluatte säilyttää tunnisteina. Jokainen muu sarake puretaan: sen nimestä tulee arvo uuteen muuttujasarakkeeseen ja solujen arvot siirtyvät arvosarakkeeseen. Tuloksen rivimäärä on syötteen rivimäärä kerrottuna purettavien arvosarakkeiden määrällä.
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 160Purettavien sarakkeiden valitseminen
Oletusarvoisesti kaikki sarakkeet, joita ei ole lueteltu parametrissa id_vars, puretaan. Parametrilla value_vars voitte purkaa vain osan sarakkeista. Sarakkeet, jotka eivät kuulu parametriin id_vars tai value_vars, poistetaan tuloksesta. Tämä on hyödyllistä, kun leveä DataFrame sisältää aikasarjasarakkeita ja muita ominaisuuksia, joita ette halua purkaa.
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)Indeksin nollaaminen melt()-funktion jälkeen
melt() säilyttää alkuperäiset rivi-indeksit toistamalla ne kullekin muuttujalle. Tuloksella on usein epäyhtenäinen indeksi, kuten [0, 1, 0, 1, 0, 1]. Hyvä käytäntö on kutsua heti melt()-funktion jälkeen reset_index(drop=True), jotta tuloksen indeksiksi saadaan siisti peräkkäinen indeksi väliltä 0–n-1.
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() on pivot()-funktion käänteisoperaatio
melt() on käsitteellisesti funktion pivot() / pivot_table() käänteisoperaatio. Pitkästä muodosta voidaan siirtyä leveään muotoon pivot_table()-funktiolla ja leveästä muodosta takaisin pitkään muotoon melt()-funktiolla. Tätä edestakaista muunnosta käytetään usein työnkuluissa: vastaanotetaan leveässä muodossa olevat tiedot, muunnetaan ne pitkään muotoon Seaborn-kuvaajia tai koneoppimisominaisuuksia varten ja muunnetaan ne tarvittaessa takaisin pivot-taulukoksi raporttia varten.
# 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()-funktion käyttäminen Seaborn-kuvaajien luomiseen
Seabornin kategoriset ja relaatioita kuvaavat kuvaajat toimivat parhaiten pitkän muodon datalla. Tyypillinen työnkulku on seuraava: aloita leveän muodon DataFramesta, jossa kullakin ryhmällä on oma sarakkeensa, muunna se melt()-funktiolla pitkään muotoon niin, että yksi sarake tunnistaa ryhmän ja toinen sisältää arvot, ja välitä sitten molemmat Seabornin hue- ja x/y-parametreille. Tämä on yksi yleisimmistä syistä käyttää melt()-funktiota.
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)Tulossarakkeiden nimeäminen
Oletusarvoisesti melt() nimeää uuden muuttujasarakkeen 'variable'-nimellä ja arvosarakkeen 'value'-nimellä. Korvatkaa nämä aina kuvaavilla nimillä käyttämällä parametreja var_name ja value_name. Kuvaavat sarakenimet helpottavat myöhemmän koodin lukemista ja ehkäisevät sekaannuksia, kun DataFramessa on kymmeniä sarakkeita.
# 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']Kyselydatan muuntaminen pitkään muotoon
Klassinen melt()-funktion käyttötapaus on kyselyvastaukset, joissa kukin sarake vastaa kysymystä ja kukin rivi vastaajaa. Muuntaminen muuttaa leveän muodon pitkäksi muodoksi, jossa on sarakkeet vastaajan tunnisteelle, kysymyksen nimelle ja vastauksen arvolle. Tämän jälkeen voitte helposti laskea vastausten jakauman kullekin kysymykselle käyttämällä groupby()-funktiota.
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())Muunnoksen tuloksen lajittelu
Muuntamisen jälkeen rivit on järjestetty alkuperäisen sarakejärjestyksen mukaan (kunkin rivin kohdalla Jan, Feb, Mar). Usein tulos kannattaa lajitella ensin tunnistesarakkeen ja sitten muuttujasarakkeen mukaan. Käyttäkää muunnoksella saadun DataFramen kanssa sort_values()-funktiota järjestyksen määrittämiseen analyysiin tai myöhempään käsittelyyn sopivalla tavalla.
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() osana datan käsittelyputkea
Tyypillisessä datan käsittelyputkessa melt() sijoittuu heti leveän muodon datan lataamisen tai puhdistamisen jälkeen ja ennen analyysi- tai mallinnusvaihetta. Sijoittakaa se putken alkuun, jotta data saadaan nopeasti pitkään muotoon. Tämän jälkeen kaikki operaatiot (groupby, seaborn, sklearn) toimivat puhtaalla pitkän muodon datalla ilman erityistapauksia.
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)Pikatarkistus
Testatkaa, miten hyvin ymmärrätte tässä oppitunnissa käsitellyn pd.melt-funktion muunnoksen leveästä muodosta pitkään muotoon.
Oppitunnin yhteenveto
Tässä oppitunnissa opitte, että melt() muuntaa datan leveästä muodosta pitkään muotoon muuttamalla sarakkeet riveiksi; id_vars määrittää sarakkeet, jotka pysyvät kiinteinä, ja value_vars valitsee muunnettavat sarakkeet; var_name ja value_name antavat uusille sarakkeille kuvaavat nimet; ja pitkä muoto on suositeltava Seabornissa, groupby-operaatioissa ja koneoppimisputkissa. Seuraavaksi tutustumme stack- ja unstack-funktioihin MultiIndex-DataFramejen muotoilussa.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”melt: leveästä pitkäksi muodoksi” ilmainen?
Kyllä – oppitunnin ”melt: leveästä pitkäksi muodoksi” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Pandas & NumPy Academy-kurssin, päivitä CoddyKit PROhon. Pandas & NumPy Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”melt: leveästä pitkäksi muodoksi”?
Muuntaa leveä DataFrame pitkäksi muodoksi pd.melt-funktiolla ja määrittäkää id_vars- sekä value_vars-parametrit. Harjoittelet Pandas & NumPy Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Pandas & NumPy Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Pandas & NumPy Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”melt: leveästä pitkäksi muodoksi”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Pandas & NumPy Academy-oppitunnilla?
Kyllä. Jokainen Pandas & NumPy Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- pivot_table: ristiintaulukointi
- melt: leveästä pitkäksi muodoksi
- stack ja unstack MultiIndex-indeksin kanssa
- crosstab frekvenssitaulukoille