Нужно посчитать долю каждой строки в сумме продаж своей группы по store: share = sales / sum(sales) внутри store. Какой вариант самый идиоматичный в pandas?

Adf["share"] = df["sales"] / df.groupby("store")["sales"].transform("sum")
Bdf["share"] = df.groupby("store")["sales"].sum() / df["sales"]
Cdf["share"] = df["sales"] / df.groupby("store").sum()
Ddf["share"] = df["sales"].apply(lambda x: x / df["sales"].sum())
Правильный ответ. Для расчёта значений на уровне строк внутри групп чаще всего используют .transform().

Разбор

.transform("sum") возвращает Series той же длины, что и исходный DataFrame, где каждой строке сопоставлена сумма ее группы. Это позволяет делать поэлементные вычисления без циклов: df["sales"] / .... Варианты с .sum() без transform() обычно дают агрегированный результат по группам и не совпадают по длине с исходными строками.

Проверь себя · 1/3разбор после ответа
Какое выражение гарантированно вернёт DataFrame (а не Series) при выборе одного столбца col?
Тренировать Python в Telegram

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