pandasОсновыEasyБесплатно~7 мин

Премиум-юзеры из Москвы с 3+ заказами

// Условие

Таблица df — денормализованная таблица заказов: у каждой строки есть город и план пользователя.

Что нужно
Найди user_id пользователей из Москвы с планом 'premium', у которых 3 или больше completed-заказов. Верни DataFrame с колонками user_id и orders_count. Сортировка по orders_count по убыванию, при равенстве — по user_id по возрастанию.

// Данные

df: order_id, user_id, city, plan, order_date, amount, status
▶ Решить в pandas-тренажёре

// Решение

Подсказка

Сначала три условия: 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.

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

// Разобраться в теме

→ pandas для аналитика