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

Pandas按自定义分位数分箱异常:仅生成中间箱问题排查

问题原因分析

你遇到的这个问题,核心是对pd.cut的bins参数逻辑理解有偏差:当你只传入两个边界值(比如20分位数和80分位数)时,pd.cut只会生成一个中间区间((19.8,79.2]),而不是你预期的三个分箱。

默认情况下,pd.cut只会把落在你指定的两个边界之间的值分配到对应的区间,小于左边界或者大于右边界的数值,因为没有匹配的分箱范围,都会被标记为NaN——这就是为什么你看到只有中间段有分箱标签,两边全是空值的原因。

正确实现方法

要生成三个符合预期的分箱,你需要给bins传入完整的边界序列,覆盖所有可能的数值范围,从而定义出三个明确的区间:

  1. 小于等于20分位数的值
  2. 20分位数到80分位数之间的值
  3. 大于等于80分位数的值

方法一:用全范围分位数定义边界

直接获取0%、20%、80%、100%的分位数作为边界,确保覆盖数据的最小值和最大值:

import pandas as pd
import numpy as np

# 构造测试数据
test = [x for x in range(0,100)]
a = pd.DataFrame(test, columns=['value'])

# 获取完整分箱边界:0%、20%、80%、100%分位数
bins = np.percentile(a['value'], [0, 20, 80, 100])

# 执行分箱,设置include_lowest=True确保最小值被包含在第一个分箱
a['bin_label'] = pd.cut(
    a['value'],
    bins=bins,
    labels=['<20分位数', '20-80分位数', '>80分位数'],
    include_lowest=True  # 让左边界从"开区间"变成"闭区间",包含最小值
)

方法二:用正负无穷覆盖所有可能值

如果担心数据极值变化(比如后续数据出现超出当前0%/100%分位数的情况),可以用正负无穷作为首尾边界:

# 定义边界:负无穷、20分位数、80分位数、正无穷
bins = [-np.inf, np.percentile(a['value'],20), np.percentile(a['value'],80), np.inf]

a['bin_label'] = pd.cut(
    a['value'],
    bins=bins,
    labels=['<20分位数', '20-80分位数', '>80分位数']
)

验证结果

执行完代码后,你可以查看前后部分数据确认分箱效果:

# 查看前25行,0-19会被分到"<20分位数"
print(a.head(25))
# 查看后25行,80-99会被分到">80分位数"
print(a.tail(25))

内容的提问来源于stack exchange,提问作者Maksim Khaitovich

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:58:40