使用pd.cut对pandas数值列分箱后出现NaN值的原因及解决方法
pandas pd.cut分箱后出现意外NaN的原因及解决方法
问题原因
pd.cut默认生成左开右闭的分箱区间,你设置的bins[0.0, 10.0, 20.0, 30.0, 50.0]对应的实际区间为:(0.0, 10.0]、(10.0, 20.0]、(20.0, 30.0]、(30.0, 50.0]- 你的数据中存在恰好等于
0.0的取值,该值不属于上述任何区间,因此会被默认赋值为NaN,和原始数据是否有缺失值无关。
解决方案
三种可行处理方式按需选择:
方案1:添加include_lowest参数(最适配当前场景)
设置include_lowest=True会自动把第一个区间的左边界纳入覆盖范围:
bins = [0.0, 10.0, 20.0, 30.0, 50.0] labels = ['1', '2', '3', '4'] df['Distance'] = pd.cut(df['Distance'], bins=bins, labels=labels, include_lowest=True)
方案2:调整bins左边界
把第一个分箱值设为略小于数据最小值的数值,让0.0落入第一个区间:
# 因为你的数据最小值为0.0,设置左边界为-0.000001即可覆盖0值 bins = [-0.000001, 10.0, 20.0, 30.0, 50.0] labels = ['1', '2', '3', '4'] df['Distance'] = pd.cut(df['Distance'], bins=bins, labels=labels)
方案3:修改区间闭合方向
设置right=False将分箱区间改为左闭右开,注意如果你的数据存在刚好等于50的取值,需要对应调整右边界:
bins = [0.0, 10.0, 20.0, 30.0, 50.0] labels = ['1', '2', '3', '4'] df['Distance'] = pd.cut(df['Distance'], bins=bins, labels=labels, right=False)
内容的提问来源于stack exchange,提问作者Roz
相关产品推荐
相关产品推荐

