连续变量分箱时如何新增缺失值类别?解决缺失类不显示问题
解决连续变量分箱时缺失值类别不显示的问题
你遇到的问题核心在于: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
相关产品推荐
相关产品推荐

