Как сделать group_by, а затем вычесть среднее значение группы из каждой записи в группе в Polars

В pandas я могу вычислить сгруппированные по центру столбцы для кадра данных со столбцами ['a','b','c'] следующим образом:

df[['b','c']] = df[['b','c']].sub(df.groupby('a')['b','c'].transform(mean))

Какой эквивалентный код в Polars?

Я попытался реализовать его с помощью sub в полярах, но он ожидает выражения, а не фрейма данных. Мне нужен исходный фрейм данных в качестве вывода, а не сгруппированная версия.

Преобразование панд является примером в руководстве пользователя: docs.pola.rs/user-guide/migration/pandas/#pandas-transform - Для точного ответа вам необходимо предоставить образец фрейма данных/исполняемого кода.

jqurious 10.08.2024 15:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TLDR. В полярах это достигается с помощью оконной функции pl.Expr.over. Конкретно ваш код pandas будет выглядеть следующим образом.

df.with_columns(
    pl.col("b", "c") - pl.col("b", "c").mean().over("a")
)

Применительно к некоторым выборочным данным это может выглядеть следующим образом.

import polars as pl

df = pl.DataFrame({
    "a": [0, 0, 0, 1, 1, 1],
    "b": [2, 2, 2, 3, 3, 3],
    "c": range(6),
})
shape: (6, 3)
┌─────┬─────┬─────┐
│ a   ┆ b   ┆ c   │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═════╪═════╡
│ 0   ┆ 2   ┆ 0   │
│ 0   ┆ 2   ┆ 1   │
│ 0   ┆ 2   ┆ 2   │
│ 1   ┆ 3   ┆ 3   │
│ 1   ┆ 3   ┆ 4   │
│ 1   ┆ 3   ┆ 5   │
└─────┴─────┴─────┘
df.with_columns(
    pl.col("b", "c") - pl.col("b", "c").mean().over("a")
)
shape: (6, 3)
┌─────┬─────┬──────┐
│ a   ┆ b   ┆ c    │
│ --- ┆ --- ┆ ---  │
│ i64 ┆ f64 ┆ f64  │
╞═════╪═════╪══════╡
│ 0   ┆ 0.0 ┆ -1.0 │
│ 0   ┆ 0.0 ┆ 0.0  │
│ 0   ┆ 0.0 ┆ 1.0  │
│ 1   ┆ 0.0 ┆ -1.0 │
│ 1   ┆ 0.0 ┆ 0.0  │
│ 1   ┆ 0.0 ┆ 1.0  │
└─────┴─────┴──────┘

Другие вопросы по теме