Pandas & NumPy Academy · Oppitunti

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.

Oppitunti 2/413 vaihetta

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  160

Peruskutsu 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    160

Purettavien 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    160

melt() 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.

Aloita maksutta

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

  1. pivot_table: ristiintaulukointi
  2. melt: leveästä pitkäksi muodoksi
  3. stack ja unstack MultiIndex-indeksin kanssa
  4. crosstab frekvenssitaulukoille
← Takaisin: Pandas & NumPy Academy