我正在使用
.map_elements
将复杂的 Python 函数应用于极坐标系的每个元素。这是一个玩具示例:
import polars as pl
df = pl.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
def sum_cols(row):
return row["A"] + row["B"]
df.with_columns(
pl.struct(pl.all())
.map_elements(sum_cols, return_dtype=pl.Int32).alias("summed")
)
shape: (3, 3)
┌─────┬─────┬────────┐
│ A ┆ B ┆ summed │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i32 │
╞═════╪═════╪════════╡
│ 1 ┆ 4 ┆ 5 │
│ 2 ┆ 5 ┆ 7 │
│ 3 ┆ 6 ┆ 9 │
└─────┴─────┴────────┘
但是,当我的函数引发异常时,Polars 会默默地使用 Nulls 作为计算的输出:
def sum_cols(row):
raise Exception
return row["A"] + row["B"]
df.with_columns(
pl.struct(pl.all())
.map_elements(sum_cols, return_dtype=pl.Int32).alias("summed")
)
shape: (3, 3)
┌─────┬─────┬────────┐
│ A ┆ B ┆ summed │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i32 │
╞═════╪═════╪════════╡
│ 1 ┆ 4 ┆ null │
│ 2 ┆ 5 ┆ null │
│ 3 ┆ 6 ┆ null │
└─────┴─────┴────────┘
当我的函数引发异常时,如何使 Polars 命令失败?
我很确定这是 Polars 中的一个错误。 https://github.com/pola-rs/polars/issues/19315
作为解决方法,您可以使用
.map_batches()
来 传递整个“列”:
import polars as pl
df = pl.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})
def sum_cols(col):
raise Exception
return pl.Series(row["A"] + row["B"] for row in col)
df.with_columns(
pl.struct(pl.all()).map_batches(sum_cols)
)
这正如人们所期望的那样传播异常。
# ComputeError: Exception: