导读:本期聚焦于小伙伴创作的《如何使用 Pandas 的 pd.cut 函数将数据列精准分割成区间?》,敬请观看详情。把连续数值拆成若干个区间,是做用户分层、年龄分组和价格带统计时的常见需求。pd.cut 作为 Pandas 内置的分箱工具,能按指定边界或固定数量自动完成切割,并支持自定义标签与左右开闭规则。实际写代码时,不少人忽略了 bins 参数传入序列与整数的差异,导致区间宽度或边界不符合预期;还有人混淆了 pd.cut 与 pd.qcut 的抽样逻辑,用错函数造成各组样本量失衡。本文从底层切分原理讲起,结合销售金额分箱示例,说明如何控制 include_lowest、labels 等参数,避免端点值落空或类别无序的问题,让分组结果可直接用于后续聚合分析。

在数据分析和数据处理任务中,我们经常需要将连续的数值列转换为离散的区间类别。Pandas 提供的 pd.cut 函数就是专门用来做这种“数据分箱”操作的工具。它可以把一列数值按照我们设定的边界切分成不同的区间,并返回每个值所属的区间类别,方便做分组统计、用户分层或特征工程。

pd.cut 函数的基本用法

pd.cut 最核心的参数是 x 和 bins。x 是待切割的一维数组或 Series,bins 可以是整数(表示均匀分成几份),也可以是具体的边界列表或数组。当 bins 为整数时,Pandas 会先计算数据的最大值和最小值,然后在范围内均匀切分;当 bins 为序列时,序列中的每一个值都会被当作区间的边界。

下面是一段最基础的代码示例,我们将一组学生考试成绩按照自定义边界分成不及格、及格、良好、优秀四个区间:

import pandas as pd

scores = pd.Series([58, 72, 85, 90, 45, 66, 78, 99])
# 自定义边界,注意边界数量比区间多1
bins = [0, 60, 75, 90, 100]
labels = ['不及格', '及格', '良好', '优秀']

result = pd.cut(scores, bins=bins, labels=labels, include_lowest=True)
print(result)
print(result.value_counts())

在上面的代码中,include_lowest 设置为 True,表示第一个区间包含左端点(即 0 分也被算作不及格)。如果不加这个参数,默认第一个区间是不包含左端点的,可能导致最小值找不到归属。labels 参数让输出的结果不再是原始的区间对象,而是我们指定的中文类别,可读性更好。

bins 为整数与序列的区别

很多初学者会混淆 bins 传整数和传序列的差异。当传入整数 n 时,pd.cut 会根据数据的极值做等宽分箱,也就是每个区间的长度相同。这种方式简单,但容易受极端值影响,例如某一个数值特别大,会导致大部分数据挤在前面几个区间里。

相比之下,传入序列可以完全由我们控制每个区间的边界,适合业务上已经定义好的规则,比如电商价格带、年龄分段等。以下示例展示等宽分箱的效果:

import pandas as pd

ages = pd.Series([5, 12, 17, 23, 35, 48, 60, 72, 80])
# 等宽分成3个区间
age_cut = pd.cut(ages, bins=3, precision=0)
print(age_cut)

这段代码中,Pandas 自动计算出年龄的最小值为 5,最大值为 80,然后将其均分为三段。precision 参数用于控制边界显示的小数精度。可以看出,等宽分箱完全不考虑实际业务含义,仅从数学上做均匀切割。

右开左闭与端点处理

pd.cut 默认生成的区间是“左开右闭”的,即 (a, b] 的形式,意味着右侧边界属于该区间,左侧边界不属于。这在处理连续变量时一般不会出问题,但如果我们的数据里包含确切的边界值(例如刚好等于 60 分),就需要注意归属。

我们可以通过 right 参数将其改为左闭右开,用 include_lowest 保证最左侧边界被包含。下面用表格总结常见参数组合的效果:

参数设置区间形式适用场景
right=True(默认)(a, b]常规连续数值,避免重复计数
right=False[a, b)离散整数且左端点重要时
include_lowest=True首个区间含左端点最小值刚好等于边界

理解这些开关,能避免“明明有数据却返回 NaN”的情况。比如最左边界的值在默认设置下若不被包含,就会变成空类别,影响后续统计。

结合 groupby 做区间统计

分箱的最终目的通常是做聚合分析。我们可以将 pd.cut 的结果作为分组键,配合 groupby 计算各区间的数量、均值等指标。这种方式在用户消费分层、成绩分布分析中非常实用。

以下示例演示按销售金额分箱后统计每组的订单数和平均金额:

import pandas as pd

orders = pd.DataFrame({
    'amount': [20, 150, 300, 450, 80, 1200, 600, 90],
    'user': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']
})

bins = [0, 100, 500, 1000, 2000]
labels = ['低消', '中消', '高消', '超高消']
orders['level'] = pd.cut(orders['amount'], bins=bins, labels=labels, include_lowest=True)

summary = orders.groupby('level', observed=True).agg(
    order_count=('amount', 'size'),
    avg_amount=('amount', 'mean')
)
print(summary)

这里 observed=True 确保只显示实际出现的区间,不会列出没有任何数据的空类别。通过这一步骤,原本零散的金额数据被转化成了清晰的业务层级,可以直接用于报表或可视化。

与 pd.qcut 的差别

除了 pd.cut,Pandas 还有 pd.qcut 函数,二者容易搞混。pd.cut 是按“值”的区间宽度来切,而 pd.qcut 是按“样本量”来切,保证每个区间里的数据个数大致相等。如果你的目标是做分位数分析,例如把用户按消费额分成人数均等的四组,就应该用 pd.qcut。

简单对比如下:

  • pd.cut:关注数值边界,区间宽度由我们或等宽规则决定
  • pd.qcut:关注样本分布,每个区间数据量尽量一致
  • 选择依据:业务已有明确分段用 cut,需平衡各组样本量用 qcut

掌握 pd.cut 的边界控制、标签设置和端点包含逻辑,基本就能应对绝大多数连续变量离散化的需求。在写代码时,建议先打印出分箱结果确认边界归属,再接入后续分析流程,可减少很多隐蔽的数据偏差。

pandaspd_cut数据分箱修改时间:2026-07-31 21:33:34

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。