如何将分类Series转换为索引并保留NaN、打印类别映射?
解决分类Series编码保留NaN并输出类别映射的问题
核心思路
先将Series转为分类类型,手动替换默认编码中的-1为NaN,同时提取分类与索引的映射关系。
完整实现代码
import pandas as pd # 示例输入Series(替换成你的实际数据即可) series = pd.Series(["red", "blue", "green", None, "red", "yellow", "green", None]) # 1. 转换为分类类型,保留原始NaN cat_series = series.astype("category") # 2. 生成编码并将默认的-1(对应NaN)替换回NaN encoded_series = cat_series.cat.codes.replace(-1, pd.NA) # 3. 构建类别与索引的映射关系,补充NaN的对应项 category_map = {cat: idx for idx, cat in enumerate(cat_series.cat.categories)} category_map[pd.NA] = pd.NA # 输出结果 print("编码后的Series:") print(encoded_series) print("\n类别-索引对应关系:") for cat, idx in category_map.items(): print(f"{cat} -> {idx}")
代码说明
- 转换为
category类型时,pandas会自动识别所有非NaN的唯一值作为类别,顺序是首次出现的顺序 cat.codes会给每个类别分配从0开始的整数,NaN对应-1,我们用replace(-1, pd.NA)把NaN还原- 通过遍历
cat_series.cat.categories可以拿到所有非NaN类别,再手动补充NaN的映射项
运行输出示例
编码后的Series: 0 0 1 1 2 2 3 <NA> 4 0 5 3 6 2 7 <NA> dtype: Int64 类别-索引对应关系: red -> 0 blue -> 1 green -> 2 yellow -> 3 <NA> -> <NA>
内容的提问来源于stack exchange,提问作者christophriepe
相关产品推荐
相关产品推荐

