使用Pandas离散化连续变量时pd.cut分箱结果不符合预期如何解决
问题根因
分箱结果不符合预期是两个类型错误导致的:
- 你的
Amount列所有值都是字符串格式,不是数值。pd.cut处理字符串时会按ASCII字典序比较大小,而非数值大小逻辑。比如字符串"110.00"首字符是'1',ASCII码比边界值"2"的首字符'2'小,会被错误判定为小于2,落入Low区间;字符串"30.00"首字符'3'比边界值"200"的首字符'2'大,会被错误判定为大于200,落入Large区间,和你看到的错误结果完全吻合。 - 你传入的分箱边界
"Inf"是字符串,pd.cut无法识别它为正无穷数值,会把它当成普通字符串参与比较,进一步打乱分箱逻辑。
修复代码
只需要先把Amount列转为浮点数值类型,同时把字符串"Inf"替换为Python原生的正无穷数值float('inf'),保证所有分箱边界都是数值类型即可:
import pandas as pd # 加载原始数据集 data = {"Amount": ["216.00","30.00","30.00","36.00","25.00","38.00","78.8","189.00","43.00","110.00"]} dataset = pd.DataFrame(data) # 转换Amount列为数值类型 dataset["Amount"] = dataset["Amount"].astype(float) # 执行分箱,使用真正的正无穷数值作为上边界 dataset["Discretized"] = pd.cut( x=dataset["Amount"], bins=[0, 2, 200, float('inf')], labels=["Low", "Medium", "Large"] ) # 打印验证结果 print(dataset)
运行结果
执行后输出的结果完全符合你设定的分箱规则:
Amount Discretized 0 216.0 Large 1 30.0 Medium 2 30.0 Medium 3 36.0 Medium 4 25.0 Medium 5 38.0 Medium 6 78.8 Medium 7 189.0 Medium 8 43.0 Medium 9 110.0 Medium
注:当前样本中没有02区间的数值,因此没有标记为Low的记录,属于正常情况。如果你的Low区间预期是覆盖更大的数值范围(比如050),直接调整
bins参数里的边界数值即可,只要保证所有边界都是数值类型就不会出现排序错误。
内容的提问来源于stack exchange,提问作者Almosino
相关产品推荐
相关产品推荐

