如何过滤Polars中包含UUID对象的列

问题描述 投票:0回答:1

我有一个 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
python uuid python-polars
1个回答
0
投票

正如@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… │
└─────────┴───────────────────────────────────┘

这里 Polars 甚至警告在文档中使用

pl.Series.map_elements
,因为应该首选本机表达式 API。

© www.soinside.com 2019 - 2024. All rights reserved.