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

连续变量分箱时如何新增缺失值类别?解决缺失类不显示问题

解决连续变量分箱时缺失值类别不显示的问题

你遇到的问题核心在于:pd.cut()默认不会把NaN值自动归为独立类别,而且pd.crosstab()默认会排除缺失值,所以交叉表中看不到'MISSING'的计数。下面是两种实用的解决方案:

方法1:利用分类类型补全缺失值类别

这种方法直接在分箱后处理NaN,将其转为自定义的缺失值类别,符合pandas分类数据的规范,步骤也更清晰:

import pandas as pd
import numpy as np

# 确认缺失值数量(你的原始代码这部分没问题)
print(train_sm1['nro_repro'].isnull().sum())  # 输出: 40

# 定义分箱边界和区间标签
bins = [-np.inf, 0, np.inf]
interval_labels = ['(-inf; 0)', '(0; +inf)']

# 执行分箱,此时NaN值仍保留为NaN
category = pd.cut(train_sm1['nro_repro'], bins=bins, labels=interval_labels)

# 为分类序列新增'MISSING'类别,并将NaN填充为该类别
category = category.cat.add_categories(['MISSING']).fillna('MISSING')

# 转成DataFrame并与原数据合并
category_df = category.to_frame(name='R_nro_repro')
train_sm1 = pd.concat([train_sm1, category_df], axis=1)

# 生成交叉表查看结果
cross_tab = pd.crosstab(train_sm1['R_nro_repro'], columns='count')
print(cross_tab)

运行后你的交叉表会显示三个类别,其中'MISSING'的计数正好是40。

方法2:分箱前替换缺失值为特殊边界值

如果你更习惯在分箱阶段直接包含缺失值类别,可以先把NaN替换成一个超出分箱边界的值,再扩展区间和标签:

import pandas as pd
import numpy as np

# 将缺失值替换为一个大于最大边界的特殊值
temp_col = train_sm1['nro_repro'].fillna(np.inf + 1)

# 扩展分箱边界,新增一个能包含特殊值的区间
bins = [-np.inf, 0, np.inf, np.inf + 2]
# 对应新增'MISSING'标签
labels = ['(-inf; 0)', '(0; +inf)', 'MISSING']

# 直接分箱,原缺失值会被自动分到'MISSING'类别
category = pd.cut(temp_col, bins=bins, labels=labels)

# 后续合并和交叉表操作与你原代码一致
category_df = category.to_frame(name='R_nro_repro')
train_sm1 = pd.concat([train_sm1, category_df], axis=1)
print(pd.crosstab(train_sm1['R_nro_repro'], columns='count'))

关键提醒

  • pd.cut()生成的是分类数据类型,默认不会包含NaN对应的类别,必须手动添加后填充;
  • pd.crosstab()默认会忽略NaN值,所以只有把NaN转为明确的类别,才能在结果中显示出来。

内容的提问来源于stack exchange,提问作者Hugo Coras

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:07:08