如何持久化并复用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
相关产品推荐
相关产品推荐

