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

如何持久化并复用Polars分类列的整数映射?

固定Polars分类列到整数的映射方案

问题核心在于:自动推断的pl.Categorical会按数据中首次出现的顺序生成类别映射,导致行顺序变化时映射结果改变。要固定映射,只需预先定义分类的类别列表,而不是让Polars自动推断。

方法1:创建DataFrame时指定固定类别

预先定义好分类的类别顺序,这样不管数据行的顺序如何,映射关系都会固定:

# 定义固定的类别顺序,a对应0,b对应1
fixed_cat = pl.Categorical(['a', 'b'])
df = pl.DataFrame({'foo': ['b', 'a']}, schema={'foo': fixed_cat})

# 转换为物理值,映射结果固定
df.with_columns(pl.col('foo').to_physical().name.suffix('_cat'))

方法2:给已有分类列重新设置固定类别

如果已经有一个自动推断类别的DataFrame,可以通过cast方法重新指定固定类别,修正映射:

# 原DataFrame(自动推断类别,映射依赖行顺序)
df = pl.DataFrame({'foo': ['b', 'a']}, schema={'foo': pl.Categorical})

# 重新设置固定类别
df = df.with_columns(pl.col('foo').cast(pl.Categorical(['a', 'b'])))

# 此时转换的映射结果固定
df.with_columns(pl.col('foo').to_physical().name.suffix('_cat'))

方法3:复用类别定义处理新DataFrame

要在新的DataFrame上应用完全相同的映射,直接复用之前定义好的分类dtype即可:

# 复用之前的fixed_cat定义
new_df = pl.DataFrame({'foo': ['a', 'b', 'b']}, schema={'foo': fixed_cat})

# 转换结果和之前完全一致
new_df.with_columns(pl.col('foo').to_physical().name.suffix('_cat'))

这种方案比手动提取字典再用replace更简便:不需要维护额外的映射字典,直接利用Polars分类类型的原生机制,代码更简洁,也能避免手动维护字典可能出现的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 20:02:13