You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:48:01