pandas.cut()用于等宽分箱,需用列表指定bins边界并配labels;qcut()用于等频分箱,遇重复值加duplicates='drop';复杂规则优先用np.select()向量化处理。

用 pandas.cut() 做等宽分箱,注意 bins 和 labels 的配合
pandas.cut() 是最常用的离散化函数,适合按数值区间切分。关键不是“分几组”,而是明确每个区间的边界和标签含义。
常见错误是直接传整数给 bins,结果发现边界不直观、标签默认为浮点区间(如 (0.999, 2.0]),后续做 groupby 或绘图时容易出错。
- 用列表指定精确边界:
pd.cut(x, bins=[0, 25, 50, 75, 100], labels=['low', 'mid-low', 'mid-high', 'high']) - 若用整数
bins=4,Pandas 会自动取x.min()到x.max()等分,但边界值可能含小数,建议搭配precision=0控制输出精度 -
include_lowest=True可让左端点闭合(即包含第一个边界值),否则最小值可能被归为NaN
用 pandas.qcut() 实现等频分箱,警惕重复值导致的 ValueError
当数据分布不均(比如大量 0 值或长尾),cut() 分出的每组样本量差异很大,这时该用 qcut()——它按分位数切,目标是每组数量大致相等。
典型报错:ValueError: Bin edges must be unique,多因数据中存在大量重复值(如用户等级字段只有 1/2/3),导致分位数计算出相同边界。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
- 加参数
duplicates='drop'可跳过重复边界(推荐) - 或先用
value_counts().cumsum() / len(x)手动估算分位点,再传给bins参数 -
qcut()默认返回IntervalIndex,若需字符串标签(如“第1四分位”),必须显式传labels,不能依赖默认
自定义分箱逻辑:用 numpy.select() 或 apply() + 条件列表
业务规则复杂时(例如:“逾期天数 ≤ 30 天为正常,31–90 天为关注,≥ 91 天为不良”),硬套 cut/qcut 反而绕路。
更直接的做法是构造布尔条件序列,用 np.select() 向量化赋值,比 apply(lambda x: ...) 快一个数量级。
- 写法示例:
np.select([df['overdue'] - 条件数组与选择数组长度必须一致,最后一个
default不可省略,否则NaN会填入 - 避免在
apply()里写 if-elif-else——除非逻辑涉及跨行计算,否则纯属性能浪费
分箱后保留原始顺序和缺失值处理
分箱结果默认不保留原索引顺序(尤其 qcut 按排序切分),且原始 NaN 会变成分箱结果里的 NaN,但含义已不同:前者是缺失,后者是“无法归类”。
- 务必检查
result.isna().sum(),区分是原始缺失还是分箱失败 - 若需保持原始顺序,不要对 Series 排序后再
qcut,应直接在原 Series 上操作 - 对含
NaN的列分箱前,可用dropna=False(cut默认支持,qcut需手动处理)或先填充再分箱
分箱看似简单,真正麻烦的是边界定义是否贴合业务、重复值如何处置、以及 NaN 在整个 pipeline 中的语义一致性——这些地方一疏忽,下游模型或报表就悄悄跑偏。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










