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

pd.Categorical与pd.CategoricalDtype的区别及分类数组用途咨询

Pandas中Categorical数组与CategoricalDtype的区别及使用场景

一、Categorical分类数组的作用与常见场景

pd.Categorical创建的是Pandas的分类数据数组,它是绑定了分类规则的一维数据容器——既存储具体数值,又附带类别约束(可选值、是否有序)。

核心作用

  • 内存优化:对于重复值多的字符串列,分类数组底层用整数编码存储,比普通object类型节省大量内存(比如十万行的地区列,内存占用可降到1/10以下)。
  • 数据校验:强制数据只能取指定类别,输入规则外的值会自动转为NaN,避免脏数据混入。
  • 有序逻辑支持:针对有明确顺序的类别(如「优/良/中/差」「青铜/白银/黄金」),可定义有序分类,排序、分组、比较时遵循自定义顺序,而非字符串默认的字典序。
  • 性能提升:分组、聚合、筛选等操作速度比object类型更快,底层是整数运算。

常见使用场景

  • 字段值为有限可选集合:如性别、地区、产品分类、订单状态。
  • 需要体现顺序逻辑的字段:如考试等级、会员等级、时间阶段(早/中/晚)。
  • 大数据量下的重复字符串列:比如百万行的用户标签、商品品类列,用分类存储大幅降低内存开销。

二、Categorical与CategoricalDtype的区别、关联及适用场景

本质差异

  • pd.Categorical():生成带分类规则的具体数据数组,是包含实际数据的容器,同时绑定对应的分类规则。
  • pd.CategoricalDtype():生成分类规则(数据类型定义),是可复用的"类型模板",只规定允许的类别、是否有序,本身不存储任何数据。

关联关系

Categorical数组必须依赖CategoricalDtype定义规则:调用pd.Categorical(data, categories=['a','b'], ordered=True)时,Pandas会自动创建CategoricalDtype实例并绑定到该数组上。可通过cat.dtype属性从Categorical数组提取其类型定义。

适用场景对比

用pd.Categorical()的场景

直接将一组数据转换为分类数组,一步生成带规则的分类数据。示例:

# 直接将列表转为有序分类数组
score_cat = pd.Categorical(['优', '良', '中'], categories=['中','良','优'], ordered=True)

用CategoricalDtype()的场景

需要复用同一套分类规则时:

  1. 给DataFrame多列指定相同分类类型;
  2. 创建DataFrame时提前定义列的分类类型;
  3. 后续修改已有数据的分类规则。

示例:

# 先定义统一的成绩分类规则
grade_type = pd.CategoricalDtype(categories=['中','良','优'], ordered=True)
# 用该规则转换多列数据
df['数学成绩'] = df['数学成绩'].astype(grade_type)
df['语文成绩'] = df['语文成绩'].astype(grade_type)

代码示例验证

你提供的代码清晰展示了两者的类型差异:

type(pd.Categorical(['a','b'],ordered=True))
Out[187]: pandas.core.arrays.categorical.Categorical  # 是数据数组

type(pd.api.types.CategoricalDtype(['a','b'], ordered=True))
Out[188]: pandas.core.dtypes.dtypes.CategoricalDtype  # 是类型定义

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:20:30