Нужно посчитать долю каждой строки в сумме продаж своей группы по store: share = sales / sum(sales) внутри store. Какой вариант самый идиоматичный в pandas?
A
df["share"] = df["sales"] / df.groupby("store")["sales"].transform("sum")B
df["share"] = df.groupby("store")["sales"].sum() / df["sales"]C
df["share"] = df["sales"] / df.groupby("store").sum()D
df["share"] = df["sales"].apply(lambda x: x / df["sales"].sum())Правильный ответ. Для расчёта значений на уровне строк внутри групп чаще всего используют
.transform(). Разбор
.transform("sum") возвращает Series той же длины, что и исходный DataFrame, где каждой строке сопоставлена сумма ее группы. Это позволяет делать поэлементные вычисления без циклов: df["sales"] / .... Варианты с .sum() без transform() обычно дают агрегированный результат по группам и не совпадают по длине с исходными строками.
Проверь себя · 1/3разбор после ответа
Какое выражение гарантированно вернёт
DataFrame (а не Series) при выборе одного столбца col?Ещё вопросы по теме «Pandas и DataFrame»
- Что вернёт выражение `df[df["price"] > 100]`?
- В `DataFrame` `df` есть столбцы `country`, `user_id`, `revenue`. Что вернёт выражение `df.loc[df["country"] == "RU", ["user_id", "revenue"]]`?
- В `df` есть столбец `age`. Какие значения `age` попадут в результат `df[(df["age"] >= 18) & (df["age"] <= 25)]`?
- Что выберет фильтр `df[~df["status"].isin(["cancelled", "returned"])]`?
- Что верно про два шага: `mask = df["col"] > 0` и затем `df[mask]`?
- Все вопросы по «Pandas и DataFrame» →