pivot требует уникальных пар index-columns и падает с ошибкой при дублях — он просто перекладывает значения. pivot_table умеет агрегировать дубли через aggfunc (по умолчанию mean), задавать fill_value и margins для итогов. На практике почти всегда берут pivot_table: он покрывает случай pivot и не ломается на реальных данных с повторами.
melt превращает wide в long: pd.melt(df, id_vars=['id'], value_vars=['jan','feb']) даёт колонки variable и value. Обратно — pivot или pivot_table: df.pivot(index='id', columns='variable', values='value'). Пара melt → pivot часто нужна, когда данные приходят в неудобной форме и надо их нормализовать перед джойном.
crosstab — это pivot_table, заточенный под подсчёт частот: pd.crosstab(df.сегмент, df.статус) сразу считает количество пересечений без указания values/aggfunc. С normalize='index' получаешь доли по строкам, normalize='columns' — по столбцам. pivot_table универсальнее (любая aggfunc по любой метрике), crosstab короче для таблиц сопряжённости.
Сначала groupby по когорте (месяц регистрации) и номеру периода, считаешь число активных. Потом pivot_table(index='когорта', columns='период', values='активные', aggfunc='sum'). Делишь каждую строку на её нулевой период — получаешь проценты удержания. Это стандартная задача продуктовой аналитики на собесе.
Пустые пересечения (нет данных для комбинации index-columns) заполняются NaN. Параметр fill_value=0 сразу подставляет ноль — удобно для матриц частот и retention, где пропуск означает «событий не было». Для итоговых строк и столбцов добавь margins=True, margins_name='Итого'.
Pandas: основы · Pandas groupby · Pandas merge / join · Pandas: временные ряды · NumPy векторизация · scipy: A/B-тесты · sklearn для аналитика · Графики: matplotlib / seaborn
Открыть весь Python-тренажёр (556 задач) →