You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars DataFrame中自定义NamedTuple类型信息丢失问题求助

问题原因

Polars 默认会将 Python NamedTuple 转换为字典/Struct 类型存储(这是 Polars 原生数据结构,更适合矢量化操作),从 DataFrame 取出元素时,默认返回的是 dict 或 Polars Struct 对象,而非原 NamedTuple 实例,因此调用依赖 NamedTuple 属性的函数会报错。

解决办法

办法1:取出数据时手动转回 NamedTuple

在处理 DataFrame 元素时,将 dict 转成 Event 实例再传入函数:

# 兼容 dict 和 Event 类型的 pretty_string
def pretty_string(event) -> str:
    if isinstance(event, dict):
        event = Event(**event)
    return f"Event: {event.name} = {event.value}"

# 调用示例
df.select(
    pl.col("events").map_elements(
        lambda lst: [pretty_string(e) for e in lst],
        return_dtype=pl.List(pl.String)
    )
)

办法2:注册自定义类型让 Polars 保留 NamedTuple

Polars 0.19.0+ 支持注册自定义 Struct 类型,直接绑定 Event 后,存入和取出都会保留原类型:

from polars import register_struct_type

# 注册 Event 为 Polars 可识别的类型
register_struct_type(Event)

# 存入 DataFrame 时自动保留类型
df = pl.DataFrame({"events": [event_table()]})

# 直接调用原 pretty_string 即可正常运行
df.select(
    pl.col("events").map_elements(
        lambda lst: [pretty_string(e) for e in lst],
        return_dtype=pl.List(pl.String)
    )
)

办法3:提前将 NamedTuple 转为 Polars Struct 存入

手动把 Event 转成 Polars Struct 再存入 DataFrame,取出时按需转回 Event:

# 将 Event 列表转为 Polars Struct 列表
events_struct = [pl.struct({"name": e.name, "value": e.value}) for e in event_table()]
df = pl.DataFrame({"events": [events_struct]})

# 取出时转回 Event 再调用函数
df.select(
    pl.col("events").map_elements(
        lambda lst: [pretty_string(Event(e["name"], e["value"])) for e in lst],
        return_dtype=pl.List(pl.String)
    )
)

内容的提问来源于stack exchange,提问作者DJDuque

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 18:18:15