Премиум-юзеры из Москвы с 3+ заказами
// Условие
Таблица df — денормализованная таблица заказов: у каждой строки есть город и план пользователя.
user_id пользователей из Москвы с планом 'premium', у которых 3 или больше completed-заказов. Верни DataFrame с колонками user_id и orders_count. Сортировка по orders_count по убыванию, при равенстве — по user_id по возрастанию.// Данные
order_id, user_id, city, plan, order_date, amount, status// Решение
Подсказка
Сначала три условия: df[(df['city'] == 'Москва') & (df['plan'] == 'premium') & (df['status'] == 'completed')].
После фильтра — .groupby('user_id').size().reset_index(name='orders_count'). Это даёт число completed-заказов на юзера.
Добавь .query('orders_count >= 3') и .sort_values(['orders_count', 'user_id'], ascending=[False, True]).
Сначала попробуй сам → Показать решение
df = load_data()
# Цепочка: filter → groupby → size → filter → sort
result = (df[(df['city'] == 'Москва') &
(df['plan'] == 'premium') &
(df['status'] == 'completed')]
.groupby('user_id')
.size()
.reset_index(name='orders_count')
.query('orders_count >= 3')
.sort_values(['orders_count', 'user_id'], ascending=[False, True])
.reset_index(drop=True))
print(result)
Паттерн filter → groupby → size → filter — один из самых частых на собесах. Альтернатива через transform: df[...].assign(cnt=lambda x: x.groupby('user_id')['user_id'].transform('count')) — оставляет все строки, удобно если потом нужны детали. Но для итоговой агрегации groupby+size быстрее и читаемее. .query('orders_count >= 3') чище, чем [mask] после reset_index.