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

Ap = events[events["event"] == "purchase"].groupby("user_id").size(); result = pd.merge(users, p, on="user_id", how="inner")
Bp = events[(events["event"] == "purchase") & (events["ts"].dt.year == 2025)].groupby("user_id").count(); result = users.merge(p, on="user_id", how="left")
Cp = events.groupby("user_id").size().reset_index(name="purchase_cnt"); result = users.merge(p, on="user_id", how="left")
Dp = events[(events["event"] == "purchase") & (events["ts"].dt.year == 2025)].groupby("user_id").size().reset_index(name="purchase_cnt"); result = users.merge(p, on="user_id", how="left")
Правильный ответ. Типичный пайплайн: фильтрация → .groupby().size()reset_index.merge(..., how="left").

Разбор

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

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

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