结论:优先用 pd.cut() 或 pd.qcut(),避免手写 loc + between;pd.cut 适用于业务定义的固定数值区间(如年龄分段),需注意 bins 升序、include_lowest=True 防最小值变 NaN;pd.qcut 适用于等频分箱(如四分位分组),重复值多时须设 duplicates='drop'。

直接说结论:用 pd.cut() 或 pd.qcut(),别手写 loc + between 堆逻辑,除非你只有 2–3 个固定区间且要精确控制开闭边界。
什么时候该用 pd.cut()?
当你有明确的业务分段标准,比如「年龄 ≤18 算未成年人,18–35 是青年,35–60 是中年,≥60 是老年」,或者「订单金额 500 元为高价」——这些都属于人为定义的、非数据驱动的区间。
关键点:
-
bins必须是升序列表,如[0, 100, 500, float('inf')],不能漏掉极值边界 -
include_lowest=True很重要:否则最小值(如 0)可能被判定为NaN,尤其当bins[0]是 0 时 -
right=False可改默认右闭左开为左闭右开,但多数业务习惯「≤」逻辑,建议保持默认right=True,再配合include_lowest - 如果
labels数量比bins少 1,会报ValueError;多 1 则直接忽略最后一个 label
什么时候该用 pd.qcut()?
当你想让每个箱子里的数据量尽量均匀,比如「把用户按消费金额分成四档,每档人数接近总数的 25%」,或建模前做等频离散化削弱长尾影响。
注意陷阱:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 若数据中存在大量重复值(如很多用户消费都是 0 元),
pd.qcut()默认抛ValueError: Bin edges must be unique - 此时必须加
duplicates='drop'或'raise',前者会自动合并重叠分位点,后者让你提前发现数据质量问题 -
q=4不一定真分出 4 个非空箱——极端分布下可能只有 2–3 个有效箱,得用value_counts()检查结果 - 不要对含
NaN的列直接qcut,先dropna()或fillna(),否则NaN全进结果列且不参与分位计算
为什么不用 loc + between 手动分组?
它能跑通,但维护成本高、易出错,典型问题包括:
- 区间衔接漏洞:比如写了
between(0,50)和between(50,80),但没指定inclusive='both'或'left',50 这个值就丢了 - 顺序依赖:后写的
loc会覆盖前面的结果,必须严格从高到低或从低到高写,一乱序就错 - 无法向量化:每条规则都要扫描全列,10 万行数据时比
cut慢 3–5 倍 - 没法直接输出分类变量(
CategoricalDtype),后续做groupby时得额外转类型
分箱后立刻要做的三件事
分箱不是终点,而是中间步骤:
- 用
df['col'].value_counts(dropna=False)看各箱数量,确认有没有整箱为空或NaN暴增 - 如果后续要
groupby,检查分箱列是否为category类型:df['bin_col'].dtype == 'category',不是就astype('category'),能省内存、加速聚合 - 别直接拿分箱结果去训练模型——
pd.cut()输出的是IntervalIndex,树模型通常要先转成整数编码(cat.codes)或 one-hot
最常被忽略的一点:分箱边界一旦在训练集上定死,预测时必须复用完全相同的 bins 列表或 qcut 的 retbins=True 返回的 bins,不能对新数据重新算分位点,否则业务逻辑和模型效果都会漂移。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










