Есть events со столбцами user_id, event, ts и таблица users со столбцом user_id. Нужно посчитать число покупок (event == 'purchase') за 2025 год по пользователю и присоединить к users, сохранив всех пользователей. Какой вариант корректен?

AФильтр event == 'purchase', агрегация groupby('user_id').size(), reset_index и merge(..., how='inner') без фильтра по году
BФильтр по типу события и dt.year == 2025, groupby('user_id').size(), reset_index(name='purchase_cnt'), merge(..., how='left')
CФильтр по типу события и году, groupby('user_id').count() без reset_index, далее merge(..., how='left') к таблице users
DБез фильтра по типу события и без года: groupby('user_id').size(), reset_index(name='purchase_cnt'), merge(..., how='left')
Правильный ответ. Типичный пайплайн: фильтрация → .groupby().size()reset_index.merge(..., how='left').

Разбор

Сначала события фильтруются по типу и периоду через булеву индексацию. Затем агрегируют по user_id — удобный счётчик строк в группе даёт .size(). Чтобы результат стал плоским и легко мерджился, делают reset_index(name='purchase_cnt'). Наконец, .merge(..., how='left') сохраняет всех пользователей из users, добавляя счётчик покупок (у пользователей без покупок будет NaN, его при необходимости заменяют на 0). Варианты с inner, без фильтра или без reset_index ломают одно из этих требований.

Проверь себя · 1/3разбор после ответа
Что вернёт выражение df[df["price"] > 100]?
Тренировать Python в Telegram

Ещё вопросы по теме «Pandas и DataFrame»