Melt: широкая таблица → длинная
// Условие
Данные пришли в широком формате: одна строка на юзера, по столбцу на каждый месяц выручки. Для аналитики и визуализации нужен длинный формат — одна строка на (юзер, месяц).
Что нужно
Разверни таблицу df в длинный формат с помощью melt:
- Колонки-идентификаторы:
user_id,plan; - Колонки
revenue_2024_01…revenue_2024_06стать значениями колонкиmonthв формате2024-01; - Значения — колонка
revenue(float); - Сортировка по
user_id, потомmonth; сброс индекса.
user_id, plan, month, revenue). Сохрани в result.// Данные
df:
user_id, plan, revenue_2024_01…revenue_2024_06// Решение
Подсказка
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 — имена новых колонок.