You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决使用pandas.Categorical时出现的“AttributeError: 'Series' object has no attribute 'codes'”错误

如何解决使用pandas.Categorical时出现的“AttributeError: 'Series' object has no attribute 'codes'”错误

别着急,我来帮你理清楚问题出在哪,以及怎么快速解决这个问题:

错误原因

你把pd.Categorical对象赋值给Series后,直接去访问Series的codes属性,但**codes是底层Categorical数组的属性,不是Series对象的属性**。Pandas为Categorical类型的Series专门提供了.cat访问器,用来操作分类相关的属性和方法,直接访问Series本身是找不到codes的。


两种快速解决方法

方法1:使用.cat.codes访问器

这是最标准的方式,通过.cat访问器获取底层Categorical对象的编码:

# 正确获取分类编码
sessions_df["experience_level"].cat.codes

方法2:直接转为整数类型

Pandas的Categorical类型在转换为int时,会自动映射为对应的codes值,结果和上面完全一致:

sessions_df["experience_level"].astype(int)

完整可运行示例

我把你的代码修正后,做了一个可直接验证的版本:

import pandas as pd

# 模拟你的CSV数据
data = {
    "user_name": ["Alice", "Alice", "Alice"],
    "sex": ["F", "F", "F"],
    "age": [29, 29, 29],
    "experience_level": ["Intermediate", "Intermediate", "Intermediate"]
}
sessions_df = pd.DataFrame(data)

# 转换为有序分类(和你原来的代码一致)
sessions_df["experience_level"] = pd.Categorical(
    sessions_df["experience_level"],
    categories=['Beginner', 'Intermediate', 'Advanced'],
    ordered=True
)

# 正确获取编码
print(sessions_df["experience_level"].cat.codes)
# 输出结果:
# 0    1
# 1    1
# 2    1
# dtype: int8

额外实用建议

  1. 保存编码为新列:如果需要把编码作为特征列保留,直接赋值即可:
    sessions_df["experience_code"] = sessions_df["experience_level"].cat.codes
    
  2. 验证分类类型:可以通过以下命令确认列的类型是否为分类类型:
    print(sessions_df["experience_level"].dtype)
    # 输出:CategoricalDtype(categories=['Beginner', 'Intermediate', 'Advanced'], ordered=True)
    
  3. 有序分类的优势:你设置了ordered=True,所以编码会严格遵循你定义的分类顺序(Beginner=0,Intermediate=1,Advanced=2),这在后续排序、数值比较,或者机器学习特征工程中都会生效,非常实用。

火山引擎 最新活动