Przejdź do głównej treści

pandas melt(): najlepszy sposób na konwersję danych szerokich na długie

Dowiedz się, jak używać pandas.melt() do zmiany kształtu DataFrame’ów z formatu szerokiego na długi, z praktycznymi przykładami i typowymi zastosowaniami.
Zaktualizowano 4 sie 2026  · 8 min Czytać

Eksploruj z AI

Otwórz w ChatGPTOtwórz w ClaudeOtwórz w Perplexity

Format szeroki jest czytelny, ale wiele zadań analitycznych i wizualizacyjnych działa lepiej na danych w formacie długim.

Funkcja pandas.melt() zmienia kształt DataFrame’a, zamieniając jedną lub więcej kolumn na wiersze, pozostawiając wybrane kolumny identyfikatorów bez zmian. Dzięki temu dane łatwiej filtrować, grupować, wizualizować i analizować.

W tym samouczku pokażę ci, jak używać funkcji pandas.melt(). Pokażę też, jak wypada w porównaniu z opcjami takimi jak pivot(), stack() i wide_to_long(). Jeśli dopiero zaczynasz z Pythonem, polecam nasz Introduction to Python, który obejmuje m.in. typy danych, listy, podstawowe funkcje i pakiety.

Jak używać pandas.melt()

Funkcja pandas.melt() konwertuje DataFrame z formatu szerokiego na długi, przekształcając nagłówki kolumn w wartości w nowej kolumnie.

Jej składnia wygląda następująco:

pandas.melt(
    frame,
    id_vars=None,
    value_vars=None,
    var_name=None,
    value_name="value",
    col_level=None,
    ignore_index=True
)

Gdzie:

  • frame: DataFrame do przekształcenia. Wymagane tylko przy użyciu pandas.melt().

  • id_vars: Kolumna lub lista kolumn, które mają pozostać bez zmian. Te kolumny identyfikują każdy wiersz po przekształceniu.

  • value_vars: Kolumna lub lista kolumn do „rozbicia” na wiersze. Jeśli pominięte, pandas przekształci wszystkie kolumny, które nie są w id_vars.

  • var_name: Nazwa nowej kolumny przechowującej oryginalne nazwy kolumn. Domyślnie „variable”, jeśli nie podano.

  • value_name: Nazwa nowej kolumny przechowującej wartości. Domyślnie „value”, jeśli nie podano.

  • col_level: Opcjonalnie określa poziom do przekształcenia przy pracy z kolumnami MultiIndex.

  • ignore_index: Jeśli True (domyślnie), tworzony jest nowy sekwencyjny indeks. Jeśli False, zachowywany jest oryginalny indeks.

Pokażę teraz przykład ilustrujący, jak powyższa składnia zmienia kształt danych.

Załóżmy, że masz poniższy zbiór danych, w którym miesięczna sprzedaż dla każdego produktu jest przechowywana w osobnych kolumnach.

Przykładowy DataFrame w formacie szerokim.

Możesz użyć pandas.melt(), aby przekonwertować kolumny miesięcy na wiersze.

# Convert the DataFrame from wide format to long format
products_sales_2025_melted = products_sales_2025.melt(
    # Keep the Product and Category columns unchanged
    id_vars=["Product", "Category"],

    # Convert the month columns into rows
    value_vars=["January", "February", "March", "April", "May", "June"],

    # Name of the new column that stores the original column names
    var_name="Month",

    # Name of the new column that stores the corresponding sales values
    value_name="Sales"
)

# Display the reshaped DataFrame
products_sales_2025_melted.head(10)

Powstały DataFrame przechowuje teraz każdy miesiąc jako oddzielny wiersz.

DataFrame przekonwertowany do formatu długiego za pomocą pandas.melt()

Częste przykłady użycia pandas.melt()

Skoro rozumiesz już, jak działa składnia pandas.melt(), pokażę ci, jak każdy parametr zachowuje się z osobna. W poniższych przykładach użyjemy powyższej tabeli. 

Przekształcanie wybranych kolumn

Parametr value_vars pozwala wskazać, które kolumny rozwinąć do wierszy. Zamiast przekształcać każdy miesiąc, możesz konwertować tylko potrzebne kolumny.

W tym przykładzie przekształcone są tylko kolumny January i February. Pozostałe kolumny miesięcy są ignorowane.

# Convert only the January and February columns into rows
product_sales_3month = products_sales_2025.melt(
    id_vars="Product",
    value_vars=["January", "February",]
)

product_sales_3month.head(20)

Przekształcanie wybranych kolumn za pomocą pandas.melt()

Zachowanie kolumn identyfikatorów

Użyj parametru id_vars, aby pozostawić jedną lub więcej kolumn bez zmian, podczas gdy pozostałe kolumny są przekształcane.

W poniższym przykładzie „Product” i „Category” pozostają bez zmian, a miesięczne kolumny sprzedaży są zamieniane na wiersze.

# Keep the Product and Category columns while melting the monthly sales
product_sales_cat = products_sales_2025.melt(
    id_vars=["Product", "Category"]
)

product_sales_cat.head()

Zachowanie kolumn identyfikatorów przy użyciu funkcji pandas.melt().

Zmiana nazw kolumn wynikowych

Jeśli zauważyłeś, kolumny wyjściowe mają domyślnie nazwy variable i value. Użyj argumentów var_name i value_name, aby nadać im opisowe nazwy.

Na przykład poniżej zmieniliśmy nazwę kolumny zmiennej na „Month”, a wartości na „Sales”.

# Keep the Product and Category columns while melting the monthly sales
# Rename Month and Sales columns
product_sales_cat = products_sales_2025.melt(
    id_vars=["Product", "Category"],
    var_name="Month",
    value_name="Sales"
)

product_sales_cat.head()

Zmiana nazw kolumn wynikowych przy użyciu var_name i value_name w funkcji pandas.melt().

Zachowanie oryginalnego indeksu

Domyślnie pandas.melt() tworzy nowy sekwencyjny indeks. Ustaw ignore_index=False, aby zachować oryginalny indeks wierszy.

# Keep the original row index after reshaping
product_sales_index = products_sales_2025.melt(
    id_vars=["Product", "Category"],
    var_name="Month",
    value_name="Sales",
    ignore_index=False
)

product_sales_index.head(10)

Użycie ignore_index=False w celu zachowania oryginalnego indeksu w funkcji pandas.melt().

W powyższym przykładzie oryginalne etykiety wierszy (0–5) są powtarzane dla każdego miesiąca zamiast zostać zastąpione nowym sekwencyjnym indeksem.

Kiedy używać pandas.melt()?

pandas.melt() przydaje się, gdy twoje dane są w formacie szerokim i trzeba je przekształcić do formatu długiego na potrzeby analizy lub wizualizacji. Uważam też tę funkcję za ważną w następujących przypadkach użycia:

  • Konwersja danych szerokich na format długi: Wiele zbiorów danych przechowuje powiązane wartości w wielu kolumnach. Taki format jest czytelny, ale może utrudniać analizę. pandas.melt() łączy te kolumny w jedną, zachowując kolumny identyfikatorów i tworząc czystszą strukturę do dalszego przetwarzania.

  • Przygotowanie danych do wykresów: Wiele bibliotek do rysowania wykresów, takich jak Seaborn, najlepiej działa na danych w formie długiej. Zamiast ręcznie łączyć wiele kolumn, możesz użyć pandas.melt(), aby przekształcić dane do oczekiwanego formatu.

  • Przygotowanie danych do analizy statystycznej: Wiele operacji w pandas, w tym groupby(), agregacje, filtrowanie i statystyki podsumowujące, staje się prostsze, gdy pomiary są przechowywane w jednej kolumnie zamiast być rozproszone po wielu kolumnach. Jeśli przekształcisz dane za pomocą pandas.melt(), zmniejszysz ilość kodu potrzebnego do analizy różnych zmiennych.

  • Tworzenie „tidy” datasetów: „Tidy” zbiór danych przechowuje każdą zmienną w osobnej kolumnie, a każdą obserwację w osobnym wierszu. Jeśli twój zbiór danych zawiera powtarzające się pomiary w kilku kolumnach, pandas.melt() jest często najszybszym sposobem na konwersję do formatu „tidy”.

Polecam nasz kurs Introduction to Data Visualization with Seaborn, aby nauczyć się tworzyć i dostosowywać różne wykresy w Pythonie, w tym scatter, count, bar i box ploty.

pandas.melt() a inne funkcje zmiany kształtu danych

Pandas oferuje kilka funkcji do zmiany kształtu danych, z których każda służy innemu celowi. Przyjrzyjmy się różnicom między nimi.

pandas.melt() vs. pivot()

Tabela poniżej pokazuje różnicę między funkcjami pandas.melt() i pivot().

melt()

pivot()

Konwertuje dane szerokie na dane długie.

Konwertuje dane długie na dane szerokie. 

Zamienia kolumny na wiersze. 

Zamienia wartości wierszy na kolumny.

Przydatne do przygotowania danych do analizy i wizualizacji.

Przydatne do podsumowywania lub prezentowania danych w raporcie.

Dlatego wybieraj melt(), gdy twoje pomiary są rozproszone po wielu kolumnach, a pivot(), gdy chcesz rozłożyć wartości wierszy na kolumny.

pandas.melt() vs. stack()

Chociaż obie funkcje zmieniają kształt danych, oto czym się różnią.

melt()

stack()

Przekształca zwykłe kolumny w wiersze.

Przenosi jeden lub więcej poziomów kolumn do indeksu. 

Zwraca standardowy DataFrame. 

Zwraca Series lub DataFrame z MultiIndexem. 

Łatwiejsze do czytania i użycia w większości zadań analitycznych.

Lepiej nadaje się do operacji zmiany kształtu opartych na indeksie.

Możesz użyć stack(), gdy potrzebujesz pracować z indeksami hierarchicznymi lub obiektami MultiIndex.

pandas.melt() vs. wide_to_long()

Obie funkcje konwertują dane szerokie na format długi, ale są zaprojektowane do różnych sytuacji, jak pokazano poniżej.

melt()

wide_to_long()

Elastyczna i działa z niemal każdym DataFrame’em.

Zaprojektowana dla zbiorów danych ze spójnymi schematami nazywania kolumn.  

Odpowiednia do ogólnych przekształceń.  

Idealna dla powtarzających się pomiarów, takich jak Sales_2023, Sales_2024 i Sales_2025.

Jeśli twój zbiór danych ma nieregularne nazwy kolumn, użyj melt(). Jeśli kolumny stosują przewidywalną konwencję nazewniczą, użyj wide_to_long(), aby przekształcić dane mniejszą liczbą linijek kodu.

Najczęstsze błędy z pandas.melt()

Chociaż pandas.melt() jest prosta w użyciu, oto najczęstsze pułapki, na które trafiałem, oraz jak je naprawić.

  • Zapominanie o id_vars: Jeśli nie podasz id_vars, pandas traktuje każdą kolumnę, która nie jest wymieniona w value_vars, jako kolumnę wartości. To może przekształcić kolumny, które miały pozostać identyfikatorami. Aby temu zapobiec, zawsze zidentyfikuj kolumny, które jednoznacznie opisują każdy rekord, i przekaż je do id_vars.

  • Przekształcanie niezamierzonych kolumn: Jeśli pominiesz value_vars, pandas przekształci wszystkie kolumny nieujęte w id_vars. To może obejmować kolumny, których nie chciałeś zmieniać. Dlatego zawsze podawaj value_vars, gdy chcesz przekształcić tylko podzbiór kolumn.

  • Niezrozumienie kształtu wyjścia: Po przekształceniu liczba wierszy rośnie, ponieważ każda wybrana kolumna staje się osobnym wierszem dla każdego rekordu. Na przykład DataFrame z 10 wierszami i 12 kolumnami miesięcy daje 120 wierszy po przekształceniu kolumn miesięcy. Dlatego zawsze sprawdzaj kształt przed i po przekształceniu, aby potwierdzić, że dane zostały poprawnie „stopione”.

  • Mylenie formatu szerokiego i długiego: Pamiętaj, że w formacie szerokim podobne wartości są przechowywane w wielu kolumnach. W formacie długim podobne wartości trafiają do jednej kolumny, a inna kolumna identyfikuje zmienną.

Dobre praktyki korzystania z pandas.melt()

Aby twój kod zmieniający kształt danych był łatwiejszy do zrozumienia i utrzymania, polecam stosować te dobre praktyki podczas używania funkcji pandas.melt():

  • Najpierw zidentyfikuj kolumny identyfikatorów: Zdecyduj, które kolumny mają pozostać bez zmian, a następnie przekaż je do id_vars.

  • Zmień nazwy generowanych kolumn: Używaj var_name i value_name zamiast polegać na domyślnych nazwach „variable” i „value”.

  • Sprawdź liczbę wierszy po przekształceniu: Zweryfikuj, czy liczba wierszy zgadza się z oczekiwaniami, zwłaszcza gdy przekształcasz wiele kolumn.

  • Użyj pivot(), aby przywrócić pierwotny kształt: Jeśli po analizie musisz odtworzyć oryginalny format szeroki, użyj funkcji pivot().

Zapisz się na nasz kurs Writing Efficient Python Code, aby nauczyć się pisać wydajny kod, który łatwo debugować i utrzymywać.

Podsumowanie

pandas.melt() to standardowa funkcja pandas do konwersji danych w formacie szerokim na format długi. Gdy zrozumiesz role id_vars i value_vars, możesz kontrolować, które kolumny pozostają identyfikatorami, a które są zamieniane na wiersze.

Aby gruntownie poznać Pythona, skorzystaj z naszych ścieżek umiejętności Python Data Fundamentals i Python Programming Fundamentals.

FAQs

Kiedy powinienem używać pandas.melt()?

Używaj jej, gdy twoje dane mają powtarzające się wartości rozproszone po kolumnach i chcesz DataFrame’a w formacie długim do analizy lub wizualizacji.

Czym są var_name i value_name?

Te parametry zmieniają nazwy generowanych kolumn, które przechowują oryginalne nazwy kolumn i odpowiadające im wartości.

Czy pandas.melt() modyfikuje oryginalny DataFrame?

Nie. Zwraca nowy przekształcony DataFrame i pozostawia oryginał bez zmian.

Jaka jest różnica między melt() a pivot()?

melt() konwertuje dane szerokie na format długi, a pivot() konwertuje dane długie z powrotem na format szeroki.

Jaka jest różnica między melt() a stack()?

melt() przekształca kolumny w wiersze, zachowując zwykły DataFrame. stack() przenosi kolumny do indeksu i tworzy hierarchiczną strukturę (MultiIndex).

Tematy

Naucz się pandas z DataCamp

course

Sprawne importowanie danych z pandas

4 godz.
63.3K
Naucz się pozyskiwać dane z popularnych formatów plików i systemów, takich jak pliki CSV, arkusze kalkulacyjne, JSON, bazy danych SQL i API.
Zobacz szczegółyRight Arrow
Rozpocznij Kurs
Zobacz więcejRight Arrow