Course
Широкий формат удобно читать, но для многих задач анализа и визуализации лучше подходит длинный формат.
Функция pandas.melt() преобразует DataFrame, превращая один или несколько столбцов в строки при сохранении выбранных идентификаторов без изменений. Это упрощает фильтрацию, группировку, визуализацию и анализ данных.
В этом руководстве я покажу, как использовать функцию pandas.melt(). Также сравню её с такими вариантами, как pivot(), stack() и wide_to_long(). Если вы только начинаете работать с Python, рекомендую пройти наш курс Introduction to Python, где рассматриваются типы данных, списки, базовые функции и пакеты.
Как использовать pandas.melt()
Функция pandas.melt() переводит DataFrame из широкого формата в длинный, преобразуя заголовки столбцов в значения нового столбца.
Её синтаксис выглядит так:
pandas.melt(
frame,
id_vars=None,
value_vars=None,
var_name=None,
value_name="value",
col_level=None,
ignore_index=True
)
Где:
-
frame: преобразуемый DataFrame. Обязателен при использованииpandas.melt(). -
id_vars: столбец или список столбцов, которые нужно оставить без изменений. Эти столбцы будут идентифицировать строки после преобразования. -
value_vars: столбец или список столбцов для «расплавления». Если не указан, pandas преобразует все столбцы, не входящие вid_vars. -
var_name: имя нового столбца, где будут храниться исходные названия столбцов. По умолчанию«variable», если не задано. -
value_name: имя нового столбца со значениями. По умолчанию«value», если не задано. -
col_level: необязательный параметр, указывает уровень столбцов для преобразования при работе с MultiIndex. -
ignore_index: еслиTrue(по умолчанию), создаётся новый последовательный индекс. ЕслиFalse, сохраняется исходный индекс.
Покажу пример, чтобы проиллюстрировать, как этот синтаксис меняет форму данных.
Предположим, у вас есть набор данных ниже, где месячные продажи для каждого продукта находятся в отдельных столбцах.

Вы можете использовать pandas.melt(), чтобы превратить столбцы с месяцами в строки.
# 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)
В результате каждый месяц теперь хранится в отдельной строке.

Типовые примеры pandas.melt()
Теперь, когда вы поняли синтаксис pandas.melt(), покажу, как ведёт себя каждый параметр по отдельности. В следующих примерах мы будем использовать приведённую выше таблицу.
Преобразовать выбранные столбцы
Параметр value_vars позволяет указать, какие столбцы «расплавлять». Вместо преобразования всех месяцев вы можете конвертировать только нужные столбцы.
В этом примере преобразуются только столбцы January и February. Остальные месяцы игнорируются.
# 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)

Сохранить идентификаторы
Используйте параметр id_vars, чтобы сохранить один или несколько столбцов без изменений, а остальные преобразовать.
В примере ниже «Product» и «Category» остаются неизменными, а месячные продажи преобразуются в строки.
# 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()

Переименовать выходные столбцы
По умолчанию выходные столбцы называются variable и value. Используйте аргументы var_name и value_name, чтобы дать им осмысленные имена.
Например, ниже мы переименовали столбец переменной в «Month», а значения — в «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()

Сохранить исходный индекс
По умолчанию pandas.melt() создаёт новый последовательный индекс. Установите ignore_index=False, чтобы сохранить исходные индексы строк.
# 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)

В примере выше исходные метки строк (0–5) повторяются для каждого месяца, а не заменяются новым последовательным индексом.
Когда следует использовать pandas.melt()?
pandas.melt() полезна, когда ваши данные находятся в широком формате и их нужно преобразовать в длинный для анализа или визуализации. Я также считаю функцию важной в следующих случаях:
-
Преобразование широких данных в длинные: Во многих наборах данных связанные значения распределены по нескольким столбцам. Хотя такой формат легко читать, он усложняет анализ.
pandas.melt()объединяет эти столбцы в один, сохраняя столбцы-идентификаторы, и создаёт более удобную структуру для дальнейшей обработки. -
Подготовка данных к визуализации: Многие библиотеки для построения графиков, например Seaborn, лучше работают с длинными данными. Вместо ручного объединения множества столбцов используйте
pandas.melt(), чтобы привести данные к ожидаемому формату. -
Подготовка к статистическому анализу: Многие операции pandas, включая
groupby(), агрегирование, фильтрацию и сводную статистику, проще выполнять, когда измерения хранятся в одном столбце, а не распределены по нескольким. Если вы преобразуете данные с помощьюpandas.melt(), вам потребуется меньше кода для анализа разных переменных. -
Создание «tidy»-наборов данных: «Аккуратный» (tidy) набор данных хранит каждую переменную в отдельном столбце, а каждое наблюдение — в отдельной строке. Если ваш набор содержит повторяющиеся измерения в нескольких столбцах,
pandas.melt()часто является самым быстрым способом привести его к tidy-формату.
Рекомендую пройти наш курс Introduction to Data Visualization with Seaborn, чтобы научиться создавать и настраивать в Python различные графики: точечные, столбчатые, ящик с усами и другие.
pandas.melt() и другие функции изменения формы данных
Pandas предлагает несколько функций для изменения формы данных, каждая служит своей цели. Давайте рассмотрим различия между ними.
pandas.melt() vs. pivot()
Таблица ниже показывает различия между функциями pandas.melt() и pivot().
|
|
|
|
Преобразует широкие данные в длинные. |
Преобразует длинные данные в широкие. |
|
Преобразует столбцы в строки. |
Преобразует значения строк в столбцы. |
|
Полезна для подготовки данных к анализу и визуализации. |
Полезна для сводного представления или подготовки отчётов. |
Следовательно, выбирайте melt(), когда ваши измерения распределены по нескольким столбцам, или pivot(), когда нужно разнести значения строк по столбцам.
pandas.melt() vs. stack()
Хотя обе функции меняют форму данных, вот в чём они различаются.
|
|
|
|
Преобразует обычные столбцы в строки. |
Переносит один или несколько уровней столбцов в индекс. |
|
Выдаёт обычный DataFrame. |
Выдаёт Series или DataFrame с многоуровневым индексом (MultiIndex). |
|
Проще для чтения и использования в большинстве аналитических задач. |
Лучше подходит для операций преобразования на основе индексов. |
Используйте stack(), когда вам нужно работать с иерархическими индексами или объектами MultiIndex.
pandas.melt() vs. wide_to_long()
Обе функции преобразуют широкие данные в длинный формат, но они рассчитаны на разные ситуации, как показано ниже.
|
|
|
|
Гибкая и подходит почти для любого DataFrame. |
Предназначена для наборов данных с согласованными шаблонами имён столбцов. |
|
Подходит для общих преобразований формы. |
Идеальна для повторяющихся измерений, таких как Sales_2023, Sales_2024 и Sales_2025. |
Если в вашем наборе данных нестандартные имена столбцов, используйте melt(). Если столбцы следуют предсказуемой схеме именования, используйте wide_to_long(), чтобы преобразовать данные с меньшим количеством кода.
Распространённые ошибки при использовании pandas.melt()
Хотя pandas.melt() проста в использовании, вот самые частые подводные камни, с которыми я сталкивался, и как их избежать.
-
Забытые id_vars: если вы не укажете
id_vars, pandas считает всеми «значениями» все столбцы, не перечисленные вvalue_vars. Это может преобразовать столбцы, которые вы хотели сохранить как идентификаторы. Чтобы этого избежать, всегда определяйте столбцы, однозначно описывающие запись, и передавайте их вid_vars. -
Непреднамеренное преобразование столбцов: если опустить
value_vars, pandas преобразует все столбцы, не указанные вid_vars. Это может включать столбцы, которые вы не планировали менять. Поэтому всегда указывайтеvalue_vars, когда нужно преобразовать только часть столбцов. -
Непонимание формы результата: после «расплавления» число строк увеличивается, потому что каждый выбранный столбец становится отдельной строкой для каждой записи. Например, DataFrame с 10 строками и 12 месячными столбцами даст 120 строк после преобразования месячных столбцов. Поэтому всегда проверяйте форму до и после преобразования, чтобы убедиться, что всё прошло корректно.
-
Путаница между широким и длинным форматами: в широком формате похожие значения хранятся в нескольких столбцах. В длинном формате похожие значения находятся в одном столбце, а другой столбец указывает переменную.
Рекомендации по использованию pandas.melt()
Чтобы ваш код преобразования формы было легче понимать и поддерживать, рекомендую придерживаться следующих практик при использовании функции pandas.melt():
-
Сначала определите столбцы-идентификаторы: решите, какие столбцы должны остаться без изменений, и передайте их в
id_vars. -
Переименуйте сгенерированные столбцы: используйте
var_nameиvalue_nameвместо стандартных имён variable и value. -
Проверьте количество строк после преобразования: убедитесь, что число строк соответствует ожиданиям, особенно при преобразовании многих столбцов.
-
Используйте pivot() для обратного преобразования: если после анализа нужно вернуть исходный широкий формат, используйте функцию
pivot().
Пройдите наш курс Writing Efficient Python Code, чтобы узнать, как писать эффективный код, который легко отлаживать и сопровождать.
Итоги
pandas.melt() — это стандартная функция pandas для преобразования данных из широкого формата в длинный. Поняв роль id_vars и value_vars, вы сможете контролировать, какие столбцы останутся идентификаторами, а какие будут превращены в строки.
Чтобы глубже понять Python, изучайте наши треки навыков Python Data Fundamentals и Python Programming Fundamentals.
FAQs
Когда мне использовать pandas.melt()?
Используйте её, когда в данных есть повторяющиеся значения, разбросанные по столбцам, и вам нужен DataFrame в длинном формате для анализа или визуализации.
Что такое var_name и value_name?
Эти параметры переименовывают сгенерированные столбцы, которые хранят исходные имена столбцов и соответствующие им значения.
Изменяет ли pandas.melt() исходный DataFrame?
Нет. Она возвращает новый преобразованный DataFrame и не изменяет исходный.
В чём разница между melt() и pivot()?
melt() преобразует широкие данные в длинный формат, а pivot() возвращает длинные данные обратно в широкий формат.
В чём разница между melt() и stack()?
melt() преобразует столбцы в строки, сохраняя обычный DataFrame. stack() переносит столбцы в индекс и создаёт иерархическую структуру (MultiIndex).