pd.cut()用于等宽分桶,需严格递增边界;pd.qcut()用于等频分桶,处理重复值需设duplicates参数;手动映射适用于有业务语义的固定区间。

用 pd.cut() 做等宽分桶最直接
pd.cut() 是 Pandas 里专为数值列做离散化(分桶)设计的函数,适合按固定宽度或自定义边界切分。它默认返回 Categorical,可直接用于分组、绘图或后续编码。
常见错误是传入字符串列或含 NaN 的列却不设 include_lowest=True 或 right=False,导致边界值被漏掉或归类异常。
- 边界必须是严格递增的一维数组,比如
[0, 25, 50, 75, 100];传入[0, 50, 25, 100]会报ValueError: bins must increase monotonically - 若原始数据含
NaN,pd.cut()默认保留为NaN,无需额外处理,但别误以为是 bug - 想让左边界闭合(例如
[0, 25)改成[0, 25]),加参数right=False;需要包含最低值(如 0 恰好在边界上),加include_lowest=True
示例:
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
import pandas as pd s = pd.Series([5, 30, 45, 70, 95]) pd.cut(s, bins=[0, 25, 50, 75, 100], include_lowest=True)结果为
[(0, 25], (25, 50], (25, 50], (50, 75], (75, 100]] —— 注意 5 落在第一个区间,因 include_lowest=True 让 0 被包含。
用 pd.qcut() 实现等频分桶(按分位数)
当数据分布不均(比如大量集中在低端、少量拖尾),用 pd.cut() 切出的桶样本量差异极大,这时该换 pd.qcut():它按分位数把数据切成数量大致相等的桶。
典型坑点是:传入重复值过多(尤其当 q 较大时),pd.qcut() 可能报 ValueError: Bin edges must be unique。这不是数据错,而是分位数计算后边界出现重复。
- 解决办法:加参数
duplicates='drop'(丢弃重复边界)或duplicates='raise'(显式报错便于调试) -
q=4表示四分位,生成 4 个桶;q=[0, 0.25, 0.5, 0.75, 1]效果相同,但更灵活(比如想切 3 桶可写[0, 0.33, 0.66, 1]) - 和
pd.cut()不同,pd.qcut()不接受自定义边界列表,只认q参数
示例:
s = pd.Series([1, 1, 1, 2, 3, 4, 5, 100]) pd.qcut(s, q=3, duplicates='drop')避免因 1 太多导致分位点重合而报错。
手动定义区间并映射标签(适合业务语义明确场景)
当桶名有业务含义(如 “低风险”“中风险”“高风险”),且边界固定(如 score cut/qcut 更可控、可读性更强。
别直接用 np.where() 堆嵌套,容易写错逻辑顺序;也别用 apply() 配函数——对大数据性能差。
- 推荐用
pd.IntervalIndex.from_tuples()+.get_indexer(),或更简单的pd.cut(..., labels=...) -
labels长度必须和bins数量减一一致,否则报ValueError: Length of labels must match number of bins - 如果某行数据超出所有区间(如
bins=[0,50,100],但值是 150),默认返回NaN,可用pd.cut(..., include_lowest=True, right=True)并配合.fillna('其他')补全
示例:
bins = [0, 60, 85, 100] labels = ['不及格', '良好', '优秀'] pd.cut(df['score'], bins=bins, labels=labels, include_lowest=True)
性能与 dtype 注意点:别让分桶结果拖慢后续操作
默认 pd.cut() 和 pd.qcut() 返回 Categorical,内存省、排序快,但某些操作(如参与数值计算、导出 CSV)会隐式转成 object,可能引发意外类型错误。
- 若后续要频繁做
groupby().size()或画直方图,保持Categorical最优 - 若要存数据库或喂给 scikit-learn,建议显式转成整数编码:
cat.codes,或字符串:cat.astype(str) - 用
retbins=True可同时拿到分桶结果和实际使用的边界(对复现、调试、跨数据集统一标准很有用)
容易被忽略的是:Pandas 2.0+ 对 Categorical 的排序行为更严格,若桶标签不是自然序(如 ['高', '中', '低']),记得用 ordered=True 和指定 categories 顺序,否则 sort_values() 会按字典序排而非业务序。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










