DataFrame.melt() / pandas.melt()

Метод melt() преобразует DataFrame из «широкого» формата в «длинный»: несколько столбцов-измерений объединяются в два — variable и value. Это операция, обратная pivot().

Сигнатура

DataFrame.melt(id_vars=None, value_vars=None, var_name=None,
               value_name='value', col_level=None, ignore_index=True)

Параметры

  • id_vars — столбцы-«якоря», которые остаются как есть.

  • value_vars — столбцы, которые «расплавляются». По умолчанию — все, кроме id_vars.

  • var_name — имя нового столбца с бывшими именами столбцов.

  • value_name — имя нового столбца со значениями.

  • ignore_index — сбросить индекс в результате.

Возвращаемое значение

Новый DataFrame в длинном формате.

Примеры

Пример 1. Базовое преобразование

import pandas as pd

df = pd.DataFrame({
    "id":  [1, 2],
    "t_a": [22, 23],
    "t_b": [21, 24],
})
print(df.melt(id_vars="id"))
   id variable  value
0   1      t_a     22
1   2      t_a     23
2   1      t_b     21
3   2      t_b     24

Пример 2. Свои имена столбцов

import pandas as pd

df = pd.DataFrame({
    "ts":  ["t0", "t1"],
    "DHT": [22.0, 23.0],
    "DS":  [22.5, 23.5],
})
print(df.melt(id_vars="ts", var_name="sensor", value_name="temp"))
   ts sensor  temp
0  t0    DHT  22.0
1  t1    DHT  23.0
2  t0     DS  22.5
3  t1     DS  23.5

Пример 3. Выбор конкретных value_vars

import pandas as pd

df = pd.DataFrame({
    "id":   [1, 2],
    "t":    [22, 23],
    "h":    [55, 60],
    "note": ["ok", "ok"],
})
print(df.melt(id_vars="id", value_vars=["t", "h"]))
   id variable  value
0   1        t     22
1   2        t     23
2   1        h     55
3   2        h     60

Пример 4. Без id_vars — расплавляется всё

import pandas as pd

df = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
print(df.melt())
  variable  value
0        a      1
1        a      2
2        b      3
3        b      4

Пример 5. Подготовка к plotly/seaborn

Длинный формат удобен для группировки по категории при построении графиков:

import pandas as pd

df = pd.DataFrame({
    "day": ["Mon", "Tue", "Wed"],
    "p1":  [5, 7, 6],
    "p2":  [8, 6, 9],
})
long = df.melt(id_vars="day", var_name="robot", value_name="runs")
print(long.groupby("robot")["runs"].mean())
robot
p1    6.000000
p2    7.666667
Name: runs, dtype: float64

См. также

Примечание

Лицензия и источники

Техническое описание функции адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Примеры и пояснения — © AlashEd Wiki.