import pandas as pd
df = pd.DataFrame(
{'seo': [100, 140], 'ads': [250, 300]},
index=['2026-01-01', '2026-01-02']
)
df.stack()
Результат:
2026-01-01 seo 100
ads 250
2026-01-02 seo 140
ads 300
dtype: int64
s = df.stack()
s.unstack()
Результат:
seo ads 2026-01-01 100 250 2026-01-02 140 300
orders = pd.DataFrame({
'date': ['2026-01-01','2026-01-01','2026-01-02','2026-01-02'],
'channel': ['seo','ads','seo','ads'],
'amount': [100, 250, 140, 300]
})
g = orders.groupby(['date','channel'])['amount'].sum()
g.unstack('channel')
Результат:
channel ads seo date 2026-01-01 250 100 2026-01-02 300 140Порешать Python-задачи в тренажёре →
Всплывает в задачах на reshape и работу с MultiIndex, часто сразу после groupby по двум ключам, когда результат нужно превратить в широкую матрицу или обратно.
stack сворачивает столбцы в строки (широкий → длинный формат) и обычно возвращает Series с MultiIndex. unstack делает обратное — поднимает уровень индекса в столбцы. Это зеркальные операции, применённые подряд возвращают исходную структуру.
По умолчанию stack(dropna=True) выбрасывает NaN, поэтому строк в результате может стать меньше. Передайте dropna=False, чтобы сохранить все комбинации. unstack наоборот заполняет отсутствующие ячейки NaN или значением fill_value.
Аргумент level принимает номер или имя уровня MultiIndex, по умолчанию берётся внутренний уровень (-1). Например g.unstack('channel') поднимет в столбцы именно уровень channel, а остальные останутся в индексе.
Pandas groupby · Pandas: основы
groupby · merge · pivot_table · apply · value_counts · drop_duplicates
Открыть Python-тренажёр (556 задач) →