pandasИзменение формыMediumБесплатно~8 мин

Melt: широкая таблица → длинная

// Условие

Данные пришли в широком формате: одна строка на юзера, по столбцу на каждый месяц выручки. Для аналитики и визуализации нужен длинный формат — одна строка на (юзер, месяц).

Что нужно
Разверни таблицу df в длинный формат с помощью melt:
  • Колонки-идентификаторы: user_id, plan;
  • Колонки revenue_2024_01…revenue_2024_06 стать значениями колонки month в формате 2024-01;
  • Значения — колонка revenue (float);
  • Сортировка по user_id, потом month; сброс индекса.
Итог: DataFrame 1200 строк × 4 колонки (user_id, plan, month, revenue). Сохрани в result.

// Данные

df: user_id, plan, revenue_2024_01…revenue_2024_06
▶ Решить в pandas-тренажёре

// Решение

Подсказка

df.melt(id_vars=['user_id','plan'], value_vars=[...], var_name='month_raw', value_name='revenue') — укажи какие колонки фиксируем (id_vars), а какие разворачиваем (value_vars).

После melt колонка month_raw содержит строки вида revenue_2024_01. Вытащи дату: .str.replace('revenue_', '').str.replace('_', '-').

Финальная цепочка: выбери нужные колонки ['user_id','plan','month','revenue'], отсортируй и сбрось индекс.

Сначала попробуй сам → Показать решение
df = load_data()

revenue_cols = [c for c in df.columns if c.startswith('revenue_2024_')]

melted = df.melt(id_vars=['user_id', 'plan'],
                  value_vars=revenue_cols,
                  var_name='month_raw',
                  value_name='revenue')

melted['month'] = melted['month_raw'].str.replace('revenue_', '').str.replace('_', '-')

result = (melted[['user_id', 'plan', 'month', 'revenue']]
          .sort_values(['user_id', 'month'])
          .reset_index(drop=True))

print(result.head(10))
print(f"shape: {result.shape}")
melt — обратная операция к pivot. Используется когда данные пришли как «один столбец на категорию» (wide format) — нужно нормализовать в tidy-data: одно наблюдение на строку. После melt удобно делать .groupby('month').sum() или строить временной ряд. Ключевые параметры: id_vars — что оставляем фиксированным, value_vars — что разворачиваем, var_name / value_name — имена новых колонок.

// Похожие задачи