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

为什么Pandas cut返回的等大小分箱看起来大小不相等?

pandas.cut等大小分箱的逻辑说明

首先明确核心规则:当你给pd.cut传入整数作为bins参数时,实现的等大小是指数值维度上的区间宽度相等,和每个区间内落入的样本数量无关——按样本分位数等分、保证每个区间样本数接近的是pd.qcut的功能,不要把两者混淆。

你看到的第一个区间左端点0.994是pandas做的端点容错处理,不是分箱宽度计算错误,具体逻辑拆解如下:

  1. 先计算待分箱数据的总跨度:示例数组[1, 7, 5, 4, 6, 3]的最小值是1,最大值是7,总跨度为7-1=6,分成3个等宽区间时,单箱的理论宽度为6/3=2。
  2. pd.cut默认生成右闭区间(即区间判定规则为左端点 < x <= 右端点),如果严格把分箱的左边界设为最小值1,那么等于1的样本会因为不满足x>左端点的规则,被判定为不属于任何分箱返回空值。
  3. 为了避免这个问题,pandas会默认把分箱整体范围在最小值一侧向外扩极小的距离:扩量为总跨度的0.1%,也就是6*0.001=0.006,因此第一个区间的左端点为1-0.006=0.994,和你运行结果里的数值完全一致。

实际计算三个区间的宽度就能验证等宽逻辑:

  • 第一个区间(0.994, 3.0]:宽度为3.0 - 0.994 = 2.006
  • 第二个区间(3.0, 5.0]:宽度为5.0 - 3.0 = 2.0
  • 第三个区间(5.0, 7.0]:宽度为7.0 - 5.0 = 2.0

第一个区间多出来的0.006宽度纯粹是为了覆盖最小值样本做的精度兼容,占单箱理论宽度的比例仅0.3%,不属于分箱规则设计上的宽度不等。
如果你不需要这个自动偏移,可以手动传入分箱边界,搭配include_lowest=True参数让第一个区间包含左端点,就不会出现0.994这类偏移值了,示例代码如下:

import numpy as np
import pandas as pd
# 手动指定等宽边界,包含最小值端点
pd.cut(np.array([1, 7, 5, 4, 6, 3]), bins=[1,3,5,7], include_lowest=True)

运行后返回的分箱区间为[1.0, 3.0]、(3.0, 5.0]、(5.0, 7.0],三个区间宽度完全相等,最小值1也会被正常归入第一个分箱。


内容的提问来源于stack exchange,提问作者An Ignorant Wanderer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:36:39