数值分箱可以将连续的数值特征转换为离散的区间特征,在数据分析、特征工程等场景中应用广泛。当我们需要按照自己设定的边界划分区间,并且要求每个区间都是右闭区间时,pandas的cut函数是最直接的实现工具。

核心参数说明
pandas的cut函数用于将数据按照指定的边界进行分箱,实现自定义边界且右闭区间的核心参数如下:
- bins:传入自定义的边界列表,列表长度需要比最终分箱数量多1,第一个元素为最小边界,最后一个元素为最大边界
- right:布尔类型参数,默认为True,表示区间为右闭区间,设置为False则为右开区间,实现右闭区间时保持默认值即可
- labels:可选参数,用于给每个分箱区间设置自定义标签,不设置时默认返回区间对象
- include_lowest:布尔类型参数,默认为False,设置为True时可以让第一个区间包含最小值,避免最小值被划分为NaN
基础实现示例
假设我们有一组学生的考试成绩数据,需要按照[0, 60, 80, 100]的边界进行分箱,要求区间为右闭区间,即0-60(包含60)、60-80(包含80)、80-100(包含100),具体实现代码如下:
import pandas as pd
import numpy as np
# 构造测试数据
scores = pd.Series([55, 62, 78, 85, 92, 58, 60, 80, 100, 45])
# 自定义分箱边界
bin_edges = [0, 60, 80, 100]
# 执行分箱操作,right=True保证右闭区间,include_lowest=True包含最小值
binned_result = pd.cut(scores, bins=bin_edges, right=True, include_lowest=True)
print("原始成绩数据:")
print(scores)
print("n分箱结果:")
print(binned_result)
print("n分箱统计:")
print(binned_result.value_counts().sort_index())
上述代码的输出结果中,每个区间都符合右闭规则,比如60会被划分到(0, 60]区间,80会被划分到(60, 80]区间,100会被划分到(80, 100]区间,最小值0也会被包含在第一个区间内。
自定义区间标签
如果希望分箱结果不是返回区间对象,而是自定义的类别标签,可以通过labels参数实现,比如将成绩分箱结果标记为不及格、良好、优秀:
import pandas as pd
scores = pd.Series([55, 62, 78, 85, 92, 58, 60, 80, 100, 45])
bin_edges = [0, 60, 80, 100]
# 自定义标签列表,长度需要和分箱数量一致
bin_labels = ["不及格", "良好", "优秀"]
# 带自定义标签的分箱
labeled_result = pd.cut(scores, bins=bin_edges, right=True, include_lowest=True, labels=bin_labels)
print("带标签的分箱结果:")
print(labeled_result)
print("n标签统计:")
print(labeled_result.value_counts().sort_index())
注意事项
在使用自定义边界进行右闭区间分箱时,需要注意以下几点:
- 自定义边界列表必须是升序排列的,否则会抛出错误
- 如果数据中存在超出边界范围的值,会被划分为NaN,需要提前确认边界是否覆盖所有数据范围
- 当
right=True且include_lowest=False时,最小值如果等于第一个边界值,会被划分为NaN,因此处理包含边界值的场景时建议开启include_lowest参数 - 如果需要将分箱结果转换为哑变量,可以在分箱结果后使用
pd.get_dummies函数实现
分箱结果转哑变量示例
如果需要将分箱后的类别特征转换为模型可用的哑变量特征,可以参考以下代码:
import pandas as pd
scores = pd.Series([55, 62, 78, 85, 92, 58, 60, 80, 100, 45])
bin_edges = [0, 60, 80, 100]
bin_labels = ["不及格", "良好", "优秀"]
labeled_result = pd.cut(scores, bins=bin_edges, right=True, include_lowest=True, labels=bin_labels)
# 转换为哑变量
dummy_features = pd.get_dummies(labeled_result, prefix="score")
print("哑变量特征:")
print(dummy_features)
pandas数值分箱右闭区间自定义边界custom_binning修改时间:2026-07-21 11:39:22