Pandas替换DataFrame分类列值报错:无法添加新类别,如何解决?
Pandas分类列替换值报错处理
问题原因
你的Remarks列是分类(Categorical)类型,该列预设的类别只有Left_only和Right_only。直接把值替换成不在预设列表里的Yesterday、Today,就会触发报错:
Cannot setitem on a Categorical with a new category (Yesterday), set the categories first
你的原始数据:
Remarks Left_only Right_only Left_only Right_only
你使用的替换代码:
DF.loc[df['Remarks'] == 'Left_only', 'Remarks'] = 'Yesterday'
解决办法
方法1:先扩展分类类别再替换
先把新值加入到列的允许分类中,再执行替换:
# 添加新的分类允许值 df['Remarks'] = df['Remarks'].cat.add_categories(['Yesterday', 'Today']) # 替换对应值 df.loc[df['Remarks'] == 'Left_only', 'Remarks'] = 'Yesterday' df.loc[df['Remarks'] == 'Right_only', 'Remarks'] = 'Today' # 可选:如果不需要原分类,删除旧类别 df['Remarks'] = df['Remarks'].cat.remove_categories(['Left_only', 'Right_only'])
方法2:转成字符串类型后替换
如果不需要保留分类特性,直接转成普通字符串再替换更省事:
# 将分类列转为字符串类型 df['Remarks'] = df['Remarks'].astype(str) # 批量替换值 df['Remarks'] = df['Remarks'].replace({'Left_only': 'Yesterday', 'Right_only': 'Today'})
方法3:直接重命名分类映射
一步完成分类的映射替换:
df['Remarks'] = df['Remarks'].cat.rename_categories({ 'Left_only': 'Yesterday', 'Right_only': 'Today' })
内容的提问来源于stack exchange,提问作者dig_123
相关产品推荐
相关产品推荐

