pandasОбъединение таблицEasyБесплатно~6 мин

Left join vs inner join: кого ты теряешь

// Условие

Есть две таблицы: df (users — все зарегистрированные) и orders (заказы — только те, кто хоть раз купил). Не все юзеры заказывали — это нормально.

Что нужно
Соедини df с orders через left join, чтобы в результате остались все 1000 юзеров. Сгруппируй по user_id и посчитай суммарную выручку. Юзерам без заказов поставь total_revenue = 0.

Верни DataFrame: user_id, total_revenue. Сортировка по user_id asc. Ровно 1000 строк.

Подсказка: если сделать inner join — потеряешь ~300 юзеров без заказов. Именно эта ошибка часто встречается в дашбордах.

// Данные

df (users): user_id, signup_date, plan
orders: order_id, user_id, amount — доступна напрямую в namespace
▶ Решить в pandas-тренажёре

// Решение

Подсказка

Начни с df.merge(orders, on='user_id', how='left'). После left join у юзеров без заказов в колонке amount будет NaN.

После merge — .groupby('user_id', as_index=False).agg(total_revenue=('amount', 'sum')). sum() в pandas по умолчанию считает NaN как 0 — это как раз то, что нужно.

Если получилось не 1000 строк — ты сделал inner join (только 700 покупателей). Измени how='inner' на how='left'.

Сначала попробуй сам → Показать решение
df = load_data()  # users
# orders уже в namespace

result = (df.merge(orders, on='user_id', how='left')
          .groupby('user_id', as_index=False)
          .agg(total_revenue=('amount', 'sum'))
          .fillna({'total_revenue': 0})
          .sort_values('user_id')
          .reset_index(drop=True))

print(result)
print(f"\nВсего юзеров: {len(result)}, без заказов: {(result['total_revenue']==0).sum()}")

Inner join возвращает только строки, которые есть в обеих таблицах — ты потерял бы 300 юзеров без заказов. Left join сохраняет всех из левой таблицы, у «пустых» появляются NaN в колонках правой. sum() в pandas трактует NaN как 0, поэтому fillna здесь не обязателен, но явный вызов делает намерение очевиднее. На собесе любят вопрос «что не так с этим кодом» — покажи how='inner' и объясни, каких юзеров он потеряет и как это ломает retention/churn метрики.

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