以极坐标表示的行的条件聚合



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

160 B
540 I
550 I
590 B
370 I

我想合并除了连续的I(即BI*(之外,以B形式出现的细胞:

160 540 550
590 370

我怎么能用polar实现这样的目标?

您可以搜索连续的"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]      │
└────────┴─────────────────┘

如果你对for循环感到满意,那就是它。我也尝试过polar的数据操作函数,但没能用这种方式。

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)

最新更新