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

Pandas中如何将NaN纳入分类变量并自定义排序

Pandas中如何将NaN纳入分类变量并自定义排序

这个问题我之前也碰到过,Pandas的分类类型默认不会把NaN归为正式类别,它会把NaN当作单独的缺失值处理,所以你直接把np.nan加到reorder_categories的列表里,自然会因为“新类别和旧类别不匹配”报错。我给你两种实用的解决方案,看哪种更贴合你的需求:

方法一:保留NaN为缺失值,让它自动排在排序末尾

如果你不想修改原始的NaN值,只是希望在排序、比较时NaN处于最后一位,只需要给非NaN的类别指定好顺序即可,Pandas的有序分类会自动把缺失值放在所有类别之后:

import pandas as pd
import numpy as np

# 假设你的DataFrame是df
df['Column'] = df['Column'].astype('category')

# 只指定非NaN类别的期望顺序
desired_order = [
    'Very Liberal', 
    'Liberal', 
    'Somewhat liberal', 
    'Moderate', 
    'Somewhat Conservative', 
    'Conservative', 
    'Very Conservative'
]

# 重新排序类别并设置为有序
df['Column'] = df['Column'].cat.reorder_categories(desired_order, ordered=True)

这样操作后,你运行df['Column'].sort_values()就能看到NaN自动排在最后;做大小比较(比如df['Column'] > 'Moderate')时,NaN也会被正确处理为不参与有效比较的缺失值。

方法二:将NaN转为显式类别,纳入排序列表

如果你需要把NaN当作一个“看得见”的类别(比如统计类别计数时要显示它),可以先把NaN替换成一个明确的标识(比如'缺失值'),再将其加入类别列表:

import pandas as pd
import numpy as np

# 把NaN替换为显式的字符串标识
df['Column'] = df['Column'].fillna('缺失值')

# 指定包含“缺失值”的完整类别顺序
desired_order = [
    'Very Liberal', 
    'Liberal', 
    'Somewhat liberal', 
    'Moderate', 
    'Somewhat Conservative', 
    'Conservative', 
    'Very Conservative',
    '缺失值'
]

# 转换为分类并排序
df['Column'] = df['Column'].astype('category').cat.reorder_categories(desired_order, ordered=True)

这种方式下,'缺失值'会成为正式的类别之一,和其他类别一起参与排序、统计,完全符合你想要的顺序。

备注:内容来源于stack exchange,提问作者justindlc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:09:37