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 160Podstawowe 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 160Wybieranie 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 160melt() 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
- pivot_table: tabulacja krzyżowa
- melt: format szeroki na długi
- stack i unstack z MultiIndex
- crosstab do tabel częstości