我正在研究具有以下结构的数据框:
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 解决这个问题?
非常感谢!
你们非常接近。
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 │
└───────────────────┴─────────┴─────────┴─────────┴──────┘