0Pricing
Pandas & NumPy Academy · Lekcja

melt: format szeroki na długi

Konwertuj DataFrame z formatu szerokiego na długi za pomocą pd.melt, określając id_vars i value_vars.

melt: format szeroki na długi to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Szeroki i długi format danych

Dane można uporządkować w dwóch podstawowych formatach. Szeroki format zawiera jeden wiersz na obiekt i rozkłada pomiary na wiele kolumn — na przykład osobne kolumny dla sprzedaży w styczniu, lutym i marcu. Długi format zawiera jeden wiersz na obserwację, kolumnę z nazwą zmiennej i drugą z jej wartością. Większość funkcji analitycznych Pandas, bibliotek uczenia maszynowego i narzędzi do wizualizacji preferuje format długi, dlatego melt() jest niezbędnym narzędziem transformacji.

Funkcja pd.melt()

pd.melt(df) (dostępne również jako df.melt()) przekształca obiekt DataFrame z szerokiego formatu do długiego. Najważniejsze parametry to id_vars (kolumny zachowywane jako niezmienione identyfikatory), value_vars (kolumny przekształcane w wiersze), var_name (nazwa nowej kolumny zmiennej) oraz value_name (nazwa nowej kolumny wartości).

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

Podstawowe wywołanie melt()

Wywołaj melt(), ustawiając id_vars na kolumny, które chcesz zachować jako identyfikatory. Każda pozostała kolumna zostanie przekształcona: jej nazwa stanie się wartością w nowej kolumnie zmiennej, a wartości z komórek zostaną przeniesione do kolumny wartości. Liczba wierszy wyniku jest równa liczbie wierszy danych wejściowych pomnożonej przez liczbę przekształcanych kolumn wartości.

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

Wybieranie kolumn do przekształcenia

Domyślnie przekształcana jest każda kolumna, której nie wymieniono w id_vars. Użyj value_vars, aby przekształcić tylko podzbiór kolumn. Kolumny, których nie ma ani w id_vars, ani w value_vars, zostaną pominięte w wyniku. Jest to przydatne, gdy szeroki obiekt DataFrame zawiera zarówno kolumny szeregu czasowego, jak i inne atrybuty, których nie chcesz przekształcać.

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)

Resetowanie indeksu po melt()

melt() zachowuje pierwotne indeksy wierszy, powtarzając je dla każdej zmiennej. Wynik często ma niesekwencyjny indeks, taki jak [0, 1, 0, 1, 0, 1]. Dobrą praktyką jest natychmiastowe wywołanie reset_index(drop=True) po melt(), aby uzyskać w wyniku czysty, sekwencyjny indeks od 0 do 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() jest odwrotnością pivot()

melt() jest koncepcyjnie odwrotnością pivot() / pivot_table(). Za pomocą pivot_table() można przejść z formatu długiego do szerokiego, a za pomocą melt() — z szerokiego z powrotem do długiego. Taka pełna transformacja jest często stosowana w potokach: otrzymujesz dane w szerokim formacie, przekształcasz je do długiego na potrzeby wykresów Seaborn lub cech uczenia maszynowego, a następnie opcjonalnie przekształcasz z powrotem do tabeli raportowej.

# 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())

Używanie melt() do tworzenia wykresów w Seaborn

Wykresy kategoryczne i relacyjne biblioteki Seaborn najlepiej działają z danymi w formacie długim. Typowy przebieg pracy wygląda tak: należy zacząć od szerokiego obiektu DataFrame, w którym każda grupa ma własną kolumnę, przekształcić go do formatu długiego za pomocą funkcji melt, tak aby jedna kolumna identyfikowała grupę, a inna zawierała wartości, a następnie przekazać obie kolumny do parametrów hue i x/y biblioteki Seaborn. Jest to jeden z najczęstszych powodów używania funkcji melt().

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)

Nazywanie kolumn wynikowych

Domyślnie funkcja melt() nadaje nowej kolumnie zmiennych nazwę 'variable', a kolumnie wartości nazwę 'value'. Zawsze należy zastępować te nazwy opisowymi nazwami za pomocą parametrów var_name i value_name. Opisowe nazwy kolumn ułatwiają czytanie dalszej części kodu i zapobiegają nieporozumieniom, gdy DataFrame zawiera dziesiątki kolumn.

# 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']

Przekształcanie danych ankietowych

Klasycznym zastosowaniem funkcji melt() są odpowiedzi ankietowe, w których każda kolumna odpowiada jednemu pytaniu, a każdy wiersz jednemu respondentowi. Przekształcenie zmienia ten szeroki format na format długi z kolumnami zawierającymi identyfikator respondenta, nazwę pytania i wartość odpowiedzi. Następnie można łatwo obliczyć rozkład odpowiedzi dla każdego pytania za pomocą funkcji groupby().

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

Sortowanie wyniku funkcji melt

Po przekształceniu wiersze są uporządkowane według pierwotnej kolejności kolumn (dla każdego wiersza: Jan, Feb, Mar). Często warto najpierw sortować według kolumny identyfikatora, a następnie według kolumny zmiennej. Należy użyć funkcji sort_values() na przekształconym obiekcie DataFrame, aby uzyskać kolejność najlepiej dopasowaną do analizy lub dalszego przetwarzania.

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() w potoku przetwarzania danych

W typowym potoku przetwarzania danych funkcja melt() pojawia się zaraz po wczytaniu lub oczyszczeniu danych w formacie szerokim, a przed etapem analizy lub modelowania. Umieszczenie jej na początku potoku pozwala szybko przejść do formatu długiego, dzięki czemu wszystkie późniejsze operacje (groupby, seaborn, sklearn) mogą działać na uporządkowanych danych w tym formacie bez dodatkowych wyjątków.

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)

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat przekształcania danych z formatu szerokiego do długiego za pomocą pd.melt z tego урокu.

Podsumowanie lekcji

W tej lekcji nauczyli się Państwo, że funkcja melt() przekształca format szeroki w format długi, zamieniając kolumny na wiersze; id_vars określa kolumny, które pozostają niezmienione, a value_vars wybiera kolumny do przekształcenia; var_name i value_name nadają nowym kolumnom opisowe nazwy; format długi jest preferowany w bibliotece Seaborn, operacjach groupby i potokach ML. Następnie poznają Państwo funkcje stack i unstack służące do zmiany kształtu obiektów DataFrame z MultiIndex.

Często zadawane pytania

Czy lekcja „melt: format szeroki na długi” jest bezpłatna?

Tak — pełny tekst „melt: format szeroki na długi” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „melt: format szeroki na długi”?

Konwertuj DataFrame z formatu szerokiego na długi za pomocą pd.melt, określając id_vars i value_vars. Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?

Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „melt: format szeroki na długi”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?

Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. pivot_table: tabulacja krzyżowa
  2. melt: format szeroki na długi
  3. stack i unstack z MultiIndex
  4. crosstab do tabel częstości
← Powrót do Pandas & NumPy Academy