如何通过物理值直接创建Polars Enum类型Series?
Polars Enum类型:直接从物理值构建Series的高效方案
问题核心
需要直接用Enum对应的物理整数创建Polars Series,避免先转字符串再构建的冗余计算,同时解决原代码中Series.to_physical()方法不存在的问题。
1. 正确获取Enum Series的物理值
Polars的Enum类型Series没有to_physical()方法,因为其底层本身就存储为整数,直接用.to_list()或.to_numpy()就能拿到物理值:
import polars as pl dt = pl.Enum(["0", "1", "2"]) s1 = pl.Series(["0", "0", "2", "1"], dtype=dt) # 直接获取物理整数列表 physical = s1.to_list() print(f"{physical=}") # 输出 physical=[0, 0, 2, 1]
2. 从物理值高效构建Enum Series
Polars没有from_physical()函数,但可以通过整数Series转Enum类型的方式实现,完全跳过字符串转换:
# 先创建整数类型Series,再转换为目标Enum dtype s2 = pl.Series(physical, dtype=pl.Int32).cast(dt) # 验证结果一致 assert s1.equals(s2)
原理说明
Polars的Enum类型是基于整数索引编码的:Enum列表中的第N个元素(从0开始计数)对应物理值N。因此直接用整数构建Series后,通过.cast()转换为Enum dtype,和从原始字符串构建的Series完全等价,且避免了字符串解析的额外开销。
修正后的完整代码
import polars as pl dt = pl.Enum(["0", "1", "2"]) s1 = pl.Series(["0", "0", "2", "1"], dtype=dt) physical = s1.to_list() print(f"{physical=}") # 高效构建Enum Series s2 = pl.Series(physical, dtype=pl.Int32).cast(dt) assert s1.equals(s2)
内容的提问来源于stack exchange,提问作者gggg
相关产品推荐
相关产品推荐

