在极坐标中使用 group_by_dynamic() 操作添加辅助 group by 子句

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

我想按每小时/每天/每周的间隔对数据进行分组,并进一步按某些其他条款进行分组。通过使用 Polars 提供的 group_by_dynamic 选项,我能够实现每小时/每天/每周分组。

在 Polars 中使用 groupby_dynamic 操作后,如何向 Polars 数据帧添加辅助非日期时间 group_by 子句?

从 csv 读取的示例数据帧是

df = pl.from_repr("""
┌─────────────────────┬──────────┬────────┬─────────┬──────────┐
│ Date                ┆ Item     ┆ Issue  ┆ Channel ┆ ID       │
│ ---                 ┆ ---      ┆ ---    ┆ ---     ┆ ---      │
│ datetime[μs]        ┆ str      ┆ str    ┆ str     ┆ i64      │
╞═════════════════════╪══════════╪════════╪═════════╪══════════╡
│ 2023-01-02 01:40:00 ┆ Item ABC ┆ ASDFFF ┆ Web     ┆ 32513995 │
│ 2023-01-02 02:15:00 ┆ Item ABC ┆ WERWET ┆ Web     ┆ 32513995 │
│ 2023-01-02 03:00:00 ┆ Item ABC ┆ BVRTNB ┆ Twitter ┆ 32513995 │
│ 2023-01-03 04:11:00 ┆ Item ABC ┆ VDFGVS ┆ Fax     ┆ 32513995 │
│ 2023-01-03 04:30:00 ┆ Item ABC ┆ QWEDWE ┆ Twitter ┆ 32513995 │
│ 2023-01-03 04:45:00 ┆ Item ABC ┆ BRHMNU ┆ Fax     ┆ 32513995 │
└─────────────────────┴──────────┴────────┴─────────┴──────────┘
""")

我使用以下代码片段使用极坐标 group_by_dynamic 操作按小时间隔对这些数据进行分组。

import polars as pl


q = (
    pl.scan_csv("Test.csv", try_parse_dates=True)
    .filter(pl.col("Item") == "Item ABC")
    .group_by_dynamic("Date", every="1h", closed="right")
    .agg(pl.col("ID").count().alias("total"))
    .sort("Date")
)

df = q.collect()

这段代码给我的结果是

┌─────────────────────┬───────┐
│ Date                ┆ total │
╞═════════════════════╪═══════╡
│ 2023-01-02 01:00:00 ┆ 2     │
│ 2023-01-02 02:00:00 ┆ 1     │
│ 2023-01-02 03:00:00 ┆ 1     │
│ 2023-01-05 04:00:00 ┆ 3     │
└─────────────────────┴───────┘

但是我想按“通道”进一步对这些数据进行分组,并期望结果为

┌────────────-──────-─┬─────────┬───────┐
│ Date                ┆ Channel ┆ total │
╞═════════════════════╪═════════╪═══════╡
│ 2023-01-02 01:00:00 ┆ Twitter ┆ 1     │
│ 2023-01-02 01:00:00 ┆ Web     ┆ 1     │
│ 2023-01-02 01:00:00 ┆ Web     ┆ 1     │
│ 2023-01-02 01:00:00 ┆ Twitter ┆ 1     │
│ 2023-01-03 01:00:00 ┆ Fax     ┆ 2     │
│ 2023-01-11 01:00:00 ┆ Twitter ┆ 1     │
└─────────────────────┴─────────┴───────┘
python python-polars
1个回答
3
投票

您可以指定

group_by

q = (
    pl.scan_csv("Test.csv", try_parse_dates=True)
    .filter(pl.col("Item") == "Item ABC")
    .group_by_dynamic("Date", every="1h", closed="right", group_by="Item")
    .agg(pl.col("ID").count().alias("total"))
    .sort("Date")
)
© www.soinside.com 2019 - 2024. All rights reserved.