Pandas.cut分箱边界与df.describe()统计值边界不一致原因咨询
分箱边界与describe统计值差异原因
两个结果对不上的核心原因是两种计算的底层逻辑完全不同,没有计算错误,只是遵循的分箱规则不一样:
pd.cut指定4个分箱时默认使用等宽分箱规则:计算逻辑是取目标列的最大值、最小值做差得到总数值跨度,除以分箱数得到每个区间的固定宽度,沿数值轴均匀切出边界,完全不考虑每个区间内的实际样本数量。
结合你的数据计算验证:最小值2.72、最大值4.01,总跨度为4.01-2.72=1.29,单箱宽度为1.29/4=0.3225,切出的边界依次为2.72(你看到的2.719是浮点计算精度误差)、3.0425、3.365、3.6875、4.01,和你得到的[(2.719, 3.042] < (3.042, 3.365] < (3.365, 3.688] < (3.688, 4.01]]分箱结果完全吻合。df.describe()输出的25%/50%/75%是样本分位数值,本质是等频分箱的切分点:计算逻辑是把所有样本按数值从小到大排序,按样本累计占比找对应位置的数值——25%分位代表全量数据里有25%的样本小于等于该值,75%分位代表有75%的样本小于等于该值,切分依据是样本量的占比,和数值跨度没有直接关系。
从你给出的分位结果(25%=3.11、75%=3.32)能看出来,你的数据集样本分布极不均匀,绝大多数样本集中在3.1~3.3的狭窄区间内,高低值区间的样本量非常少,因此按样本占比切出来的分位点自然会集中在数值中段,和等宽分箱均匀切出的边界存在明显差异。
如果需要让
pd.cut的分箱边界和describe输出的分位值对齐,不要使用默认等宽逻辑,可以手动传入分位数作为分箱边界,示例代码:pd.cut(df['目标列名'], bins=df['目标列名'].quantile([0, 0.25, 0.5, 0.75, 1]))该写法会按等频规则分箱,每个区间内的样本量大致相等,边界就会和describe的统计结果匹配。
内容的提问来源于stack exchange,提问作者heng xia
相关产品推荐
相关产品推荐

