如何在Pandas中将多分类重命名合并为指定三类?
问题
现有分类集合:Bathing、Cooking、Cleaning、Cooking and Drinking、Cooking, cleaning and drinking、Domestic use,需要将这些分类合并重命名为Cooking、Drinking、Cleaning三类。已知可以用 pandas 的Categorical类型,参考示例代码:
df3 = pd.Categorical(['cooking', 'domestic use', 'cleaning', 'drinking'])
想要实现类似df3.rename_categories(...)的重命名合并效果。
解决方法
pandas 的rename_categories方法支持用字典做映射,正好可以实现多旧分类合并到新分类的需求。注意不能用集合(集合无法定义映射关系),必须用键值对明确每个旧分类对应的目标分类。
基础实现(合并分类)
import pandas as pd # 构造示例分类数据 df3 = pd.Categorical(['Bathing', 'Cooking', 'Cleaning', 'Cooking and Drinking', 'Cooking, cleaning and drinking', 'Domestic use']) # 定义映射规则:旧分类 → 新分类 category_map = { # 归到 Cooking 类的旧分类 'Cooking': 'Cooking', 'Cooking and Drinking': 'Cooking', 'Cooking, cleaning and drinking': 'Cooking', # 归到 Cleaning 类的旧分类 'Cleaning': 'Cleaning', 'Bathing': 'Cleaning', 'Domestic use': 'Cleaning' } # 执行重命名合并 df3 = df3.rename_categories(category_map) # 查看结果 print(df3.categories) # 输出:Index(['Cleaning', 'Cooking'], dtype='object')
确保保留所有目标分类(包括无数据的Drinking)
如果需要强制保留Drinking分类(即使当前没有对应数据),可以先通过set_categories设置完整的目标分类列表,再做映射:
# 先指定所有目标分类 df3 = df3.set_categories(['Cooking', 'Drinking', 'Cleaning']) # 执行映射(覆盖所有旧分类) df3 = df3.rename_categories(category_map) print(df3.categories) # 输出:Index(['Cooking', 'Drinking', 'Cleaning'], dtype='object')
注意点
- 映射必须用字典:键是旧分类名,值是新分类名,集合无法完成多对一的合并逻辑
- 所有旧分类都要在映射字典中定义,否则未被映射的分类会被转为
NaN - 如果需要保留空分类(比如示例中的Drinking),必须先调用
set_categories指定完整分类列表
内容的提问来源于stack exchange,提问作者Caly Saratuki
相关产品推荐
相关产品推荐

