You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 04:54:18