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




