使用 python-polars 的“True”实例的分数

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

我正在研究具有以下结构的数据框:

df = pl.DataFrame({
    "datetime": [
        "2024-09-24 00:00",
        "2024-09-24 01:020",
        "2024-09-24 02:00",
        "2024-09-24 03:00",
    ],
    "Bucket1": [2.5, 8, 0.7, 12],
    "Bucket2": [3.7, 10.1, 25.9, 9.9],
    "Bucket3": [40.0, 15.5, 10.7, 56],
})

我的目标是输出一个表格,计算一组值在我的数据集中出现的次数,如下所示:

shape: (4, 2)
┌───────────────────┬──────┐
│ datetime          ┆ 0-10 │
│ ---               ┆ ---  │
│ str               ┆ u32  │
╞═══════════════════╪══════╡
│ 2024-09-24 00:00  ┆ 2    │
│ 2024-09-24 01:020 ┆ 1    │
│ 2024-09-24 02:00  ┆ 1    │
│ 2024-09-24 03:00  ┆ 1    │
└───────────────────┴──────┘

我尝试了几种方法,例如使用

pl.when
.is_between
一起执行类似
when (Bucket1.is_between(0, 10, closed="left") | Bucket1.is_between(0, 10, closed="left")) then (1)

的操作

但是无论有多少 Bucket 评估为 True,结果都评估为 1。

并且还使用连接列表

columns = ["Bucket1", "Bucket2", "Bucket3"]
df.with_coumns(
    .pl.concat_list(
        [pl.col(col).is_between(0,10,closed="left") for col in columns]
    )
    .arr.sum()
    .alias("0-10")
)

第一种方法不起作用,因为它只返回布尔值列表。第二个错误为

Invalid input for "col", Expected iterable of type "str" or "DataType", got iterable of "Expr"

如何使用 Polar 解决这个问题?

非常感谢!

python dataframe python-polars
1个回答
0
投票

你们非常接近。

cols = ["Bucket1", "Bucket2", "Bucket3"]

df.with_columns(
    pl.concat_list(pl.col(cols).is_between(0,10,closed="left")).list.sum().alias("0-10")
)
shape: (4, 5)
┌───────────────────┬─────────┬─────────┬─────────┬──────┐
│ datetime          ┆ Bucket1 ┆ Bucket2 ┆ Bucket3 ┆ 0-10 │
│ ---               ┆ ---     ┆ ---     ┆ ---     ┆ ---  │
│ str               ┆ f64     ┆ f64     ┆ f64     ┆ u32  │
╞═══════════════════╪═════════╪═════════╪═════════╪══════╡
│ 2024-09-24 00:00  ┆ 2.5     ┆ 3.7     ┆ 40.0    ┆ 2    │
│ 2024-09-24 01:020 ┆ 8.0     ┆ 10.1    ┆ 15.5    ┆ 1    │
│ 2024-09-24 02:00  ┆ 0.7     ┆ 25.9    ┆ 10.7    ┆ 1    │
│ 2024-09-24 03:00  ┆ 12.0    ┆ 9.9     ┆ 56.0    ┆ 1    │
└───────────────────┴─────────┴─────────┴─────────┴──────┘
© www.soinside.com 2019 - 2024. All rights reserved.