我有一个极坐标 List[f64],列为“a”。我想创建一个新的 List[f64],列为“b”,它是 a 列中该行列表的最小值到最大值的序列,间隔为 0.5(含)。因此,对于列“a”列表中的行[0.0, 3.0, 2.0, 6.0, 2.0]
,b 列中的值应为[0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0]
。
这是我的解决方案,但是它有一个错误。
df = df.with_columns(
pl.col("a").list.eval(
pl.arange(pl.element().min(), pl.element().max(), 1)
.append(pl.arange(pl.element().min(), pl.element().max(), 1) + 0.5)
.append(pl.element().max())
.append(pl.element().max() - 0.5)
.unique()
.sort(),
parallel=True,
)
.alias("b")
)
当 a 列的列表中仅包含 1 个唯一值时,它无法处理极端情况。由于 polars 似乎只有一个整数arange()
函数,当我创建第二个列表并添加 0.5 时,如果只有一个唯一值,则会导致输出中有 2 个值,即实际看到的值和实际看到的值 - 0.5
这是一些玩具数据。列“a”包含列表,其中的最小值和最大值应用于定义序列的边界,即列“b”。
pl.DataFrame([
pl.Series('a', [[4.0, 5.0, 3.0, 7.0, 0.0, 1.0, 6.0, 2.0], [2.0, 4.0, 3.0, 0.0, 1.0], [1.0, 2.0, 3.0, 0.0, 4.0], [1.0, 3.0, 2.0, 0.0], [1.0, 0.0]], dtype=pl.List(pl.Float64)),
pl.Series('b', [[0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0], [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0], [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0], [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0], [0.0, 0.5, 1.0]], dtype=pl.List(pl.Float64))
])
速度在这里非常重要,为此,我正在用 Polars 重写。谢谢。
它相对简单,只需创建一个从
2*min
到的包含整数范围2*max
并将其除以 2 即可:pl.int_ranges()
创建整数列表。pl.Expr.repeat_by()
创建一个2
具有相同长度的列表,以便我们可以用它除第一个列表。