pandas stack() и unstack(): смена формата long ↔ wide через MultiIndex

stack и unstack — зеркальная пара для смены формата таблицы. stack «складывает» столбцы в строки (широкий → длинный формат) и обычно возвращает Series с MultiIndex; unstack поднимает уровень индекса обратно в столбцы. Аналитику это нужно, чтобы превратить результат groupby по двум ключам в матрицу и обратно. Нюанс: stack по умолчанию выбрасывает NaN.

Синтаксис

df.stack(level=-1, dropna=True) / df.unstack(level=-1, fill_value=None)

Примеры использования

Пример 1: stack: столбцы в строки

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

Пример 2: unstack: обратно в широкий формат

s = df.stack()
s.unstack()

Результат:

            seo  ads
2026-01-01  100  250
2026-01-02  140  300

Пример 3: unstack результата groupby по двум ключам

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-задачи в тренажёре →

Типичная ошибка

stack(dropna=True) по умолчанию выбрасывает NaN, поэтому результат может «похудеть» — передайте dropna=False, чтобы сохранить все комбинации. unstack, наоборот, заполняет пустые ячейки NaN (или fill_value), из-за чего могут смениться dtype колонок.

Где спрашивают на собеседовании

Всплывает в задачах на reshape и работу с MultiIndex, часто сразу после groupby по двум ключам, когда результат нужно превратить в широкую матрицу или обратно.

FAQ: частые вопросы про stack / unstack

Чем stack отличается от unstack?

stack сворачивает столбцы в строки (широкий → длинный формат) и обычно возвращает Series с MultiIndex. unstack делает обратное — поднимает уровень индекса в столбцы. Это зеркальные операции, применённые подряд возвращают исходную структуру.

Куда деваются пропуски при stack?

По умолчанию stack(dropna=True) выбрасывает NaN, поэтому строк в результате может стать меньше. Передайте dropna=False, чтобы сохранить все комбинации. unstack наоборот заполняет отсутствующие ячейки NaN или значением fill_value.

Как выбрать, какой уровень разворачивать?

Аргумент level принимает номер или имя уровня MultiIndex, по умолчанию берётся внутренний уровень (-1). Например g.unstack('channel') поднимет в столбцы именно уровень channel, а остальные останутся в индексе.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas groupby · Pandas: основы

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →