使用pd.Categorical创建有序分类数据时出现NaN的原因咨询
现象成因说明
根本原因
该问题由分类字符串的字符不匹配导致,具体为区间分隔符的字符类型不一致:
- DataFrame中实际存储的区间值,分隔符为ASCII标准短横线(
-,Unicode编码U+002D),比如0 - 20%中的横杠 - 手动输入的categories参数里,前四个区间使用的是全角长破折号(
—,Unicode编码U+2014),与实际值的短横线不属于同一字符,无法匹配
仅有最后一个分类80% - 100%使用了正确的短横线,因此只有匹配该值的行会保留原始值,其余所有值无法匹配到预设分类,被pandas统一处理为NaN。
复制unique返回值正常的原因
从unique()结果中复制的字符串完全和DataFrame内的真实存储值一致,不存在字符差异,因此所有值都能匹配到对应分类,不会生成NaN。
字符差异验证方法
可通过以下代码验证两类横杠的编码差异:
# 提取实际值中的横杠 actual_dash = dist_copy.pct_free_reduced_lunch.iloc[0].split()[1] # 手动输入的长破折号 manual_input_dash = "—" print(f"实际横杠编码:{ord(actual_dash)},手动输入横杠编码:{ord(manual_input_dash)}")
若两个输出数值不一致,即可确认是分隔符字符不匹配的问题。
避坑建议
后续定义分类顺序时,可直接从unique()结果中按期望顺序提取值,避免手动输入出现字符偏差:
# 按需求自定义分类顺序 custom_order = ['0 - 20%', '20% - 40%', '40% - 60%', '60% - 80%', '80% - 100%'] dist_copy['pct_free_reduced_lunch'] = pd.Categorical( dist_copy['pct_free_reduced_lunch'], categories=custom_order, ordered=True )
内容的提问来源于stack exchange,提问作者Joseph Shuffield
相关产品推荐
相关产品推荐

