极坐标中行的条件聚合
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"
对,将它们切换为 true
和 cumsum
。
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] │
└────────┴─────────────────┘
我有一些包含 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"
对,将它们切换为 true
和 cumsum
。
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] │
└────────┴─────────────────┘