极坐标中行的条件聚合

Conditional aggregation of rows in polars

我有一些包含 2 列的数据,格式如下:

160 B
540 I
550 I
590 B
370 I

除了连续的 I(即 BI*)之外,我还想合并以 B 形式出现的单元格:

160 540 550
590 370

如何使用 polars 实现这样的效果?

如果您对 for 循环感到满意,就是这样。我也尝试过使用 polars 的数据操作函数,但我没能做到这一点。

import polars as pl

df = pl.DataFrame({
    "nums": [160, 540, 550, 590, 370],
    "letters": ["B", "I", "I", "B", "I"]
})

out = []
for d, l in zip(df["nums"], df["letters"]):
    if l == "B":
        out.append([d])
    elif l == "I":
        out[-1].append(d)
    else:
        raise Exception("Unknown letter: " + l)

print(out)

您可以搜索连续的 "B" -> "I" 对,将它们切换为 truecumsum


df = pl.DataFrame({
    "nums": [160, 540, 550, 590, 370],
    "letters": ["B", "I", "I", "B", "I"]
})

(df.groupby(
    [
        ((pl.col("letters") + pl.col("letters").shift(-1)) == "BI")
        .cumsum()
        .alias("cumsum")
    ],
    maintain_order=True,
).agg([pl.col("nums").list()]))

这输出:

shape: (2, 2)
┌────────┬─────────────────┐
│ cumsum ┆ nums            │
│ ---    ┆ ---             │
│ u32    ┆ list [i64]      │
╞════════╪═════════════════╡
│ 1      ┆ [160, 540, 550] │
├╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌┤
│ 2      ┆ [590, 370]      │
└────────┴─────────────────┘