Pandas如何基于分类编码更优雅替换分类列取值
Pandas分类列按编码替换值的优雅实现方案
问题描述
- 需求:基于已知的分类编码映射规则(编码
0对应Female、编码1对应Male)替换Pandas分类列的取值,由于无法提前获知列的原始取值,不能预先构建映射字典,因此无法使用map方法。 - 现有方案的不足:当前实现需要先提取分类列的整数编码、填充缺失值,再重新构建分类列,涉及两次类型转换,逻辑冗余。核心实现代码如下:
df['Gender'] = pd.Categorical.from_codes(df['Gender'].cat.codes.fillna(-1), categories=['Female', 'Male'])
场景复现:已知编码与新分类值的对应关系,但无法拿到原始分类值构建map字典,完整测试代码如下:
import pandas as pd df = pd.DataFrame({ 'Name': ['Jack', 'John', 'Jil', 'Jax'], 'Gender': ['M', 'M', 'F', pd.NA], }) df['Gender'] = df['Gender'].astype('category') # 不可行方案:无法提前获知原始值,不能构建如下映射字典 # df['Gender'] = df['Gender'].map({'M': 'Male', 'F': 'Female'}) # 已知规则:编码0 = Female, 编码1 = Male # 待优化的现有实现 df['Gender'] = pd.Categorical.from_codes(df['Gender'].cat.codes.fillna(-1), categories=['Female', 'Male'])
更简洁的实现方案
直接使用分类列自带的rename_categories方法,按编码顺序传入新的分类名称即可,不需要做编码提取、类型重建操作:
df['Gender'] = df['Gender'].cat.rename_categories(['Female', 'Male'])
方案说明
- 分类列的整数编码是固定的,
rename_categories传入的列表顺序会严格对应编码顺序:列表第0位元素替换编码0对应的原始分类名,第1位元素替换编码1对应的原始分类名,完全匹配已知的编码映射规则。 - 分类列中的缺失值对应编码固定为
-1,rename_categories会自动保留缺失值,不需要额外做填充处理,原代码中的fillna(-1)属于冗余操作。 - 整个操作仅修改分类的标签映射,不需要做整列的类型转换,性能更好,代码语义也更清晰。
内容的提问来源于stack exchange,提问作者zaidwaqi
相关产品推荐
相关产品推荐

