如何用pandas按指定分箱规则为DataFrame列创建带标签新列
pandas分箱错误解决方案
错误原因
你出现报错和分箱数量不符的核心原因是bins参数定义错误:
- 你将每个分箱的上下限单独拆分为独立的bin边界,最终生成的bin边界总数为29个,对应需要28个标签,和你定义的15个标签数量不匹配,因此抛出
ValueError: Bin labels must be one fewer than the number of bin edges - 多余的bin边界会生成大量你不需要的空区间,导致最终分箱数量远高于预期的15个
解决方法
重新定义符合规则的bin边界,15个标签对应需要16个bin边界,同时调整pd.cut的区间开闭参数适配你的分箱规则:
步骤1:定义正确的bins和labels
你的分箱规则对应左闭右开区间,例如1.0 - 1.19等价于[1.0, 1.2),10.0+等价于[10.0, +∞),≤0的数值对应标签0,因此正确的bin边界为:
import numpy as np labels = ['0','1.0 - 1.19' ,'1.2 – 1.39','1.4 – 1.59', '1.6 – 1.79','1.8 – 1.99','2.0 – 2.99','3.0 – 3.99','4.0 – 4.99','5.0 – 5.99','6.0 – 6.99','7.0 – 7.99','8.0 – 8.99','9.0 – 9.99','10.0+'] # 共16个bin边界,刚好匹配15个标签 bins = [-np.inf, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, np.inf]
步骤2:调用pd.cut生成分箱列
调整pd.cut参数适配区间规则,按列处理原有A-J列即可:
df[['new1','new2','new3','new4','new5','new6','new7','new8','new9','new10']] = df[['A', 'B', 'C','D','E','F','G','H','I','J']].apply( lambda col: pd.cut( col, bins=bins, labels=labels, right=False, # 区间左闭右开,匹配你的数值覆盖规则 include_lowest=True # 包含第一个区间的左边界,确保0值被正确分配 ) )
运行上述代码即可生成符合预期的new1-new10列,不会再出现分箱数量不符和报错问题。
内容的提问来源于stack exchange,提问作者chuky pedro
相关产品推荐
相关产品推荐

