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
相关产品推荐
相关产品推荐

