使用pandas.cut拆分连续变量时出现数值跳过问题如何解决
问题原因分析
你的代码核心错误是误用了replace()方法处理pd.cut()的返回结果:
pd.cut()执行后会返回和输入列长度完全一致的分箱结果序列,序列中每个元素是对应行数值所属的区间对象replace()方法的作用是匹配原列中的指定值做替换,你直接把分箱结果序列传入replace(),相当于要求pandas在全是数值的原列里匹配区间对象做替换,这一匹配逻辑完全不成立,最终只有极少量异常匹配的结果被替换成了区间,绝大多数原值(包括99999、34095等)都被保留了下来,才会出现你看到的统计结果。
解决方法
直接把pd.cut()的返回结果赋值给目标列即可,不需要调用replace():
df = pd.read_csv(...) # 直接赋值分箱结果,可赋值给新列避免覆盖原始数据 df['capital-gain_bin'] = pd.cut(df['capital-gain'], [0,45000,110000,150000], right=False, include_lowest=True) df['capital-gain_bin'].value_counts()
如果需要覆盖所有可能的取值范围,避免超出[0,150000)区间的数值被标记为NaN,可以在分箱边界首尾添加无穷值:
df['capital-gain_bin'] = pd.cut(df['capital-gain'], [-float('inf'),0,45000,110000,150000,float('inf')], right=False, include_lowest=True)
执行后所有数值都会被分配到对应的区间,不会再出现原值单独统计的情况。
内容的提问来源于stack exchange,提问作者Amaranth
相关产品推荐
相关产品推荐

