python 计算Polars Dataframe 中范围列的组平均值

yhived7q  于 2023-02-18  发布在  Python
关注(0)|答案(1)|浏览(158)

下面是下面的代码:

import datetime
import polars as pl

df = pl.DataFrame(
    {
        "id": [1, 2, 1, 2, 1, 2, 3],
        "date": [
            datetime.date(2022, 1, 1),
            datetime.date(2022, 1, 1),
            datetime.date(2022, 1, 11),
            datetime.date(2022, 1, 11),
            datetime.date(2022, 2, 1),
            datetime.date(2022, 2, 1),
            datetime.date(2022, 2, 1),
        ],
        "value": [1, 2, 3, None, 5, 6, None],
    }
)

df.groupby_dynamic("date", by="id", every="1mo", period="1mo", closed="both").agg(
    pl.arange(1, pl.count() + 1) - pl.arange(1, pl.count() + 1).filter(pl.col("value").is_not_null()).mean(),
)

但是,当我运行它,我得到了下面的错误,我不太明白.

pyo3_runtime.PanicException: index out of bounds: the len is 1 but the index is 1

我想要实现的行为是:对于每个组,创建一个从1到该组中行数的自然序列,并从中减去该组中"值"列中非空值的平均值。(如果该组中所有"值"都为空,则返回空值)。
更具体地说,我想要的结果是

shape: (5, 3)
┌─────┬────────────┬──────────────────┐
│ id  ┆ date       ┆ arange           │
│ --- ┆ ---        ┆ ---              │
│ i64 ┆ date       ┆ list[f64]        │
╞═════╪════════════╪══════════════════╡
│ 1   ┆ 2022-01-01 ┆ [-1.0, 0.0, 1.0] │
│ 1   ┆ 2022-02-01 ┆ [0.0]            │
│ 2   ┆ 2022-01-01 ┆ [-1.0, 2.0, 1.0] │
│ 2   ┆ 2022-02-01 ┆ [0.0]            │
│ 3   ┆ 2022-02-01 ┆ [null]           │
└─────┴────────────┴──────────────────┘

我怎样才能做到这一点?

t98cgbkg

t98cgbkg1#

看起来你可能需要"爆炸",然后实现你的逻辑。

(
   df
   .groupby_dynamic(
      "date", by="id", every="1mo", period="1mo", closed="both")
   .agg([
      pl.exclude("date"),
      pl.arange(1, pl.count() + 1),
      pl.arange(1, pl.count() + 1).mean().alias("mean"),
      pl.count()])
   .with_row_count("group")
   .explode(["value", "arange"])
   .with_columns(
      pl.when(pl.col("value").is_not_null())
        .then(pl.col("mean"))) 
)
shape: (9, 7)
┌───────┬─────┬────────────┬───────┬────────┬──────┬───────┐
│ group | id  | date       | value | arange | mean | count │
│ ---   | --- | ---        | ---   | ---    | ---  | ---   │
│ u32   | i64 | date       | i64   | i64    | f64  | u32   │
╞═══════╪═════╪════════════╪═══════╪════════╪══════╪═══════╡
│ 0     | 1   | 2022-01-01 | 1     | 1      | 2.0  | 3     │
│ 0     | 1   | 2022-01-01 | 3     | 2      | 2.0  | 3     │
│ 0     | 1   | 2022-01-01 | 5     | 3      | 2.0  | 3     │
│ 1     | 1   | 2022-02-01 | 5     | 1      | 1.0  | 1     │
│ 2     | 2   | 2022-01-01 | 2     | 1      | 2.0  | 3     │
│ 2     | 2   | 2022-01-01 | null  | 2      | null | 3     │
│ 2     | 2   | 2022-01-01 | 6     | 3      | 2.0  | 3     │
│ 3     | 2   | 2022-02-01 | 6     | 1      | 1.0  | 1     │
│ 4     | 3   | 2022-02-01 | null  | 1      | null | 1     │
└───────┴─────┴────────────┴───────┴────────┴──────┴───────┘

之后,您可以使用group列将它们重新组合在一起。

相关问题