为什么Pandas cut返回的等大小分箱看起来大小不相等?
pandas.cut等大小分箱的逻辑说明 首先明确核心规则:当你给pd.cut传入整数作为bins参数时,实现的等大小是指数值维度上的区间宽度相等,和每个区间内落入的样本数量无关——按样本分位数等分、保证每个区间样本数接近的是pd.qcut的功能,不要把两者混淆。
你看到的第一个区间左端点0.994是pandas做的端点容错处理,不是分箱宽度计算错误,具体逻辑拆解如下:
- 先计算待分箱数据的总跨度:示例数组
[1, 7, 5, 4, 6, 3]的最小值是1,最大值是7,总跨度为7-1=6,分成3个等宽区间时,单箱的理论宽度为6/3=2。 pd.cut默认生成右闭区间(即区间判定规则为左端点 < x <= 右端点),如果严格把分箱的左边界设为最小值1,那么等于1的样本会因为不满足x>左端点的规则,被判定为不属于任何分箱返回空值。- 为了避免这个问题,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
相关产品推荐
相关产品推荐

