Polars - 将行展平为列,按列值聚合

问题描述 投票:0回答:1

我正在尝试在 Polars 中编写一个脚本,该脚本可以扁平化每个日期和分钟的价格列表。问题是我想逐步聚合到列中并将值归零。例如。想法是,如果可能的话,使该解决方案矢量化,以提高其性能。

df = pl.DataFrame({
    "date": ["2022-01-01", "2022-01-01", "2022-01-02", "2022-01-02", 
             "2022-01-02", "2022-01-03", "2022-01-03", "2022-01-03"],
    "minute": [1, 2, 1, 2, 3, 1, 2, 3],
    "price": [10, 20, 15, 10, 20, 30, 60, 70]
})

应构建以下数据框。

-------------------------------------------------------
| date         | minute | 1_price | 2_price | 3_price  
-------------------------------------------------------
| "2022-01-01" | 1      | 10      | 0       | 0
| "2022-01-01" | 2      | 10      | 20      | 0
| "2022-01-02" | 1      | 15      | 0       | 0
| "2022-01-02" | 2      | 15      | 10      | 0
| "2022-01-02" | 3      | 15      | 10      | 20
| "2022-01-03" | 1      | 30      | 0       | 0
| "2022-01-03" | 2      | 30      | 60      | 0
| "2022-01-03" | 3      | 30      | 60      | 70
dataframe etl python-polars rust-polars
1个回答
0
投票

这似乎有效

df.join(
    df.pivot('price', 'date','minute','first'),
    on='date') \
    .select("date", "minute",
            **{f"{x}_price":pl.when(pl.lit(x)<=pl.col('minute'))
                              .then(pl.col(f"{x}"))
                              .otherwise(0)
                              for x in df['minute'].unique().sort()})
shape: (8, 5)
┌────────────┬────────┬─────────┬─────────┬─────────┐
│ date       ┆ minute ┆ 1_price ┆ 2_price ┆ 3_price │
│ ---        ┆ ---    ┆ ---     ┆ ---     ┆ ---     │
│ str        ┆ i64    ┆ i64     ┆ i64     ┆ i64     │
╞════════════╪════════╪═════════╪═════════╪═════════╡
│ 2022-01-01 ┆ 1      ┆ 10      ┆ 0       ┆ 0       │
│ 2022-01-01 ┆ 2      ┆ 10      ┆ 20      ┆ 0       │
│ 2022-01-02 ┆ 1      ┆ 15      ┆ 0       ┆ 0       │
│ 2022-01-02 ┆ 2      ┆ 15      ┆ 10      ┆ 0       │
│ 2022-01-02 ┆ 3      ┆ 15      ┆ 10      ┆ 20      │
│ 2022-01-03 ┆ 1      ┆ 30      ┆ 0       ┆ 0       │
│ 2022-01-03 ┆ 2      ┆ 30      ┆ 60      ┆ 0       │
│ 2022-01-03 ┆ 3      ┆ 30      ┆ 60      ┆ 70      │
└────────────┴────────┴─────────┴─────────┴─────────┘

您的示例显示的不仅仅是展平,但您似乎正在寻找的是,只要 x 大于分钟列中的任何值,x_price 列就应该为 0。这就是通过枢轴、自连接以及何时/那么/其他方式实现的。

© www.soinside.com 2019 - 2024. All rights reserved.