我有一个 Polars DataFrame,其中第
id
列中包含 UUID 类型。我强烈喜欢将它们存储为 UUID,而不是在创建 DataFrame 之前将它们转换为 str/int 等。从我的数据创建 df
工作正常,但如果我尝试在列 id
上进行筛选,则会遇到错误。
如何通过给定的 UUID 过滤列
id
?
import polars as pl
from uuid import UUID
df = pl.DataFrame(
[
{"message": "foo", "id": UUID("925afb28-f437-4c46-b9b2-ae9ebb7899a9")},
{"message": "bar", "id": UUID("f9278c55-4c11-4b68-a1aa-de9d6086efb6")},
],
schema={"message": pl.String, "id": pl.Object},
)
df.shape
>> (2, 2)
df.filter(pl.col("id").eq(UUID("925afb28-f437-4c46-b9b2-ae9ebb7899a9")))
>> TypeError: invalid literal value: '925afb28-f437-4c46-b9b2-ae9ebb7899a9'
df.filter(pl.col("id").eq(str(UUID("925afb28-f437-4c46-b9b2-ae9ebb7899a9"))))
>> ComputeError: cannot cast 'Object' type
正如@Dean MacGregor 已经指出的那样,您应该强烈避免依赖任何
object
类型的数据,而应使用底层箭头类型之一。
不过,在您的示例中,可以根据与
UUID
类的另一个对象的比较进行过滤,如下所示。
(
df
.filter(
pl.col("id").map_elements(lambda id: id == UUID("925afb28-f437-4c46-b9b2-ae9ebb7899a9"))
)
)
输出。
shape: (1, 2)
┌─────────┬───────────────────────────────────┐
│ message ┆ id │
│ --- ┆ --- │
│ str ┆ object │
╞═════════╪═══════════════════════════════════╡
│ foo ┆ 925afb28-f437-4c46-b9b2-ae9ebb78… │
└─────────┴───────────────────────────────────┘
pl.Series.map_elements
,因为应该首选本机表达式 API。