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.