Дан DataFrame с заказами (user_id, order_date, amount). Посчитайте для каждого пользователя число заказов, суммарную выручку и дату последнего заказа, а затем выделите топ-5 пользователей по выручке.
Короткий ответ
- groupby по user_id с именованными агрегатами agg
- count для числа заказов, sum для выручки, max для даты
- reset_index, чтобы вернуть обычный DataFrame
- Топ-5 через nlargest или sort_values с head
- Проверить типы: order_date должен быть datetime
- Обсудить пропуски в amount до агрегации
Задача решается одним groupby-agg с именованными агрегатами и выбором топа через nlargest — важно проговорить типы данных и пропуски.
Как сказать вслух
пример ответаЭто классический groupby: группирую по пользователю и одним вызовом agg считаю количество заказов, сумму и максимум даты. Потом беру топ пять по выручке через nlargest. Вслух я бы ещё проговорил проверки: что дата приведена к datetime, а в суммах нет пропусков, иначе агрегаты посчитаются не так, как ожидаем.
Подробный ответ
Основной ответ
Базовая задача на владение pandas: groupby по user_id и метод agg с именованными агрегациями, который сразу даёт понятные имена колонок. Число заказов — count (или size, если нужны строки с NaN), выручка — sum, последний заказ — max по дате. Для топ-5 идиоматичен nlargest(5, 'revenue') — он читабельнее и быстрее полной сортировки. Хороший кандидат проговаривает граничные случаи: order_date нужно привести через pd.to_datetime, пропуски в amount решить явно (count их игнорирует, sum считает как 0 после fillna), а при желании добавить средний чек как производную колонку. На больших данных стоит упомянуть, что цепочка groupby-agg эффективнее циклов по группам на порядки.
Ключевые моменты
- Именованные агрегаты. agg(orders=('amount','count'), revenue=('amount','sum')) даёт чистые имена без MultiIndex.
- nlargest вместо сортировки. Для топ-N nlargest читабельнее и не сортирует весь DataFrame.
- count против size. count не учитывает NaN в колонке, size считает все строки группы — разница важна при пропусках.
- Типы данных. Строковая дата сломает max по смыслу; сначала pd.to_datetime.
Практический контекст
Такое задание дают на лайвкодинге в первые десять минут, чтобы проверить повседневную беглость: аналитик делает подобное ежедневно при подготовке витрин и отчётов. Смотрят не только на результат, но и на стиль: именованные агрегаты, отсутствие циклов, проговаривание проверок данных. Часто просят развить: добавить средний чек, отфильтровать период, разбить по месяцам.
Пример кода
import pandas as pd
df["order_date"] = pd.to_datetime(df["order_date"])
stats = (
df.groupby("user_id")
.agg(
orders=("amount", "count"),
revenue=("amount", "sum"),
last_order=("order_date", "max"),
)
.reset_index()
)
top5 = stats.nlargest(5, "revenue")
print(top5)Частые ошибки
- Пишут цикл по пользователям вместо groupby
- Забывают reset_index и путаются в MultiIndex при дальнейшей работе
- Не проверяют тип колонки с датой перед взятием максимума