В pandas я могу вычислить сгруппированные по центру столбцы для кадра данных со столбцами ['a','b','c'] следующим образом:
df[['b','c']] = df[['b','c']].sub(df.groupby('a')['b','c'].transform(mean))
Какой эквивалентный код в Polars?
Я попытался реализовать его с помощью sub в полярах, но он ожидает выражения, а не фрейма данных. Мне нужен исходный фрейм данных в качестве вывода, а не сгруппированная версия.
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 │
└─────┴─────┴──────┘
Преобразование панд является примером в руководстве пользователя: docs.pola.rs/user-guide/migration/pandas/#pandas-transform - Для точного ответа вам необходимо предоставить образец фрейма данных/исполняемого кода.