Reshape в Pandas

«Reshape» — это превращение таблицы из «широкой» в «длинную» форму и наоборот. В Pandas для этого есть четыре основных инструмента: melt (wide→long), pivot/pivot_table (long→wide), stack (столбцы→индекс), unstack (индекс→столбцы).

Когда использовать

  • Графики ggplot/seaborn часто требуют длинную форму.

  • Отчёты для людей — широкую.

  • Промежуточные преобразования для groupby.

Пример 1. melt — wide → long

import pandas as pd

wide = pd.DataFrame({
    "device": ["bot1", "bot2"],
    "temp":   [22, 24],
    "hum":    [55, 50],
})
long = wide.melt(id_vars="device", var_name="sensor", value_name="value")
print(long)

Output:

  device sensor  value
0   bot1   temp     22
1   bot2   temp     24
2   bot1    hum     55
3   bot2    hum     50

Пример 2. pivot — long → wide

import pandas as pd

long = pd.DataFrame({
    "device": ["bot1", "bot1", "bot2", "bot2"],
    "sensor": ["temp", "hum",  "temp", "hum"],
    "value":  [22, 55, 24, 50],
})
print(long.pivot(index="device", columns="sensor", values="value"))

Output:

sensor  hum  temp
device
bot1     55    22
bot2     50    24

Пример 3. stack

import pandas as pd

df = pd.DataFrame({"a": [1, 2], "b": [3, 4]}, index=["x", "y"])
print(df.stack())

Output:

x  a    1
   b    3
y  a    2
   b    4
dtype: int64

Пример 4. unstack

import pandas as pd

idx = pd.MultiIndex.from_product([["x", "y"], ["a", "b"]])
s = pd.Series([1, 3, 2, 4], index=idx)
print(s.unstack())

Output:

   a  b
x  1  3
y  2  4

Пример 5. Выбор уровня для unstack

import pandas as pd

idx = pd.MultiIndex.from_tuples(
    [("bot1", "t"), ("bot1", "h"), ("bot2", "t"), ("bot2", "h")],
    names=["device", "sensor"],
)
s = pd.Series([22, 55, 24, 50], index=idx)
print(s.unstack("sensor"))

Output:

sensor   h   t
device
bot1    55  22
bot2    50  24

Пример 6. wide_to_long

import pandas as pd

df = pd.DataFrame({
    "id": [1, 2],
    "v_2024": [10, 20],
    "v_2025": [11, 21],
})
long = pd.wide_to_long(df, stubnames="v", i="id", j="year", sep="_")
print(long)

Output:

          v
id year
1  2024  10
2  2024  20
1  2025  11
2  2025  21

Пример 7. Цепочка melt → pivot

import pandas as pd

wide = pd.DataFrame({"device": ["bot1"], "temp": [22], "hum": [55]})
long = wide.melt(id_vars="device", var_name="sensor", value_name="value")
back = long.pivot(index="device", columns="sensor", values="value")
print(back)

Output:

sensor  hum  temp
device
bot1     55    22

Подводные камни

  • stack/unstack после операций может вернуть Series вместо DataFrame — следите за типом.

  • melt не сохраняет порядок строк автоматически — сортируйте по нужному ключу при необходимости.

  • Если в данных есть NaN, unstack оставит их в широкой форме.

См. также

Примечание

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

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