pandas.cut 离散化分箱函数详解与实战

Luna
Luna
发布时间:2026-10-14| 2人浏览过
原创

本文详细介绍 pandas.cut 函数的核心用途与参数配置。通过解析 bins 的三种形式、right 边界控制、labels 标签映射及 retbins 返回值等关键参数,结合年龄分组实战案例,展示如何实现数据离散化、自定义区间分割及结果可视化,帮助开发者高效处理连续数据的分类问题。

pandas.cut 函数概述

用途

pandas.cut 函数主要用于将一组连续数据划分为离散的区间(分箱)。例如,面对一组年龄数据,可以利用该函数将其划分为不同的年龄段区间,并赋予相应的标签,从而实现数据的离散化处理。

原型


pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise') #0.23.4

核心参数详解

参数含义

x:待切分的类数组数据,必须为一维结构(不支持 DataFrame 类型)。

bins:定义切分后的区间(也称为“桶”、“箱”或“面元”),支持三种形式:整数标量、标量序列(数组)或 pandas.IntervalIndex 对象。

一个int型的标量

当 bins 指定为整数标量时,表示将数据 x 均匀划分为该数量的区间。此时,x 的范围在左右两侧各扩展 0.1%,以确保最大值和最小值均被包含在区间内。

标量序列

当 bins 为标量序列时,序列中的数值定义了每个区间 bin 的边缘值。在此模式下,x 的数据范围不会进行自动扩展。

pandas.IntervalIndex

允许用户定义精确使用的区间对象,提供更高的灵活性。

right:布尔型参数,默认为 True,表示区间是否包含右侧边界。例如,若 bins=[1,2,3] 且 right=True,则生成的区间为 (1,2] 和 (2,3];若 right=False,则区间变为 (1,2) 和 (2,3)。

labels:用于为分割后的 bins 添加标签,例如将年龄区间标记为“青年”、“中年”等。labels 的长度必须与划分后的区间数量一致。例如,若 bins=[1,2,3] 生成了两个区间 (1,2] 和 (2,3],则 labels 的长度必须为 2。

若指定 labels=False,则返回 x 中每个数据所在的 bin 索引(从 0 开始计数)。

retbins:布尔型参数,控制是否返回分割后的 bins 对象。当 bins 为整数标量时,设置此参数为 True 有助于获取具体的划分区间,默认值为 False。

precision:控制区间小数点的保留位数,默认值为 3。

include_lowest:布尔型参数,决定区间左侧是否包含边界值,默认为 False(即左侧为开区间,不包含左边界)。

duplicates:处理重复区间的策略。可选值为 'raise'(不允许重复,报错)或 'drop'(允许重复,自动处理)。

返回值

out:返回值为 pandas.Categorical、Series 或 ndarray 类型,表示 x 中每个值所属的 bin(区间)。如果指定了 labels,则返回对应的标签。

bins:当 retbins 设置为 True 时,返回分割后的区间数组。

实战案例:年龄数据分箱

例子

以下示例以年龄分组为例进行演示。


import numpy as np
import pandas as pd

ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年龄数据

将ages平分成5个区间


ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) 
pd.cut(ages, 5)

输出:

[(0.901, 20.8], (0.901, 20.8], (0.901, 20.8], (20.8, 40.6], (20.8, 40.6], ..., (0.901, 20.8], (0.901, 20.8], (20.8, 40.6], (20.8, 40.6], (20.8, 40.6]] Length: 16 Categories (5, interval[float64]): [(0.901, 20.8] < (20.8, 40.6] < (40.6, 60.4] < (60.4, 80.2] < (80.2, 100.0]]

结果显示 ages 被均匀划分为 5 个区间,且区间边界经过扩展以包含原始数据的最大值和最小值。

将ages平分成5个区间并指定labels


ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年龄数据
pd.cut(ages, 5, labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"])

输出:

[婴儿, 婴儿, 婴儿, 青年, 青年, ..., 婴儿, 婴儿, 青年, 青年, 青年] Length: 16 Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年]

给ages指定区间进行分割


ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年龄数据
pd.cut(ages, [0,5,20,30,50,100], labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"])

输出:

[婴儿, 婴儿, 青年, 壮年, 壮年, ..., 青年, 青年, 中年, 中年, 壮年] Length: 16 Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年]

此处未对 ages 进行均匀划分,而是指定了 5 个自定义区间:(0, 5], (5, 20], (20, 30], (30, 50], (50, 100]。

返回分割后的bins

只需设置 retbins=True 即可实现。


ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年龄数据
pd.cut(ages, [0,5,20,30,50,100], labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"],retbins=True)

输出:

([婴儿, 婴儿, 青年, 壮年, 壮年, ..., 青年, 青年, 中年, 中年, 壮年] Length: 16 Categories (5, object): [婴儿 < 青年 < 中年 < 壮年 < 老年], array([ 0, 5, 20, 30, 50, 100]))

只返回x中的数据在哪个bin

只需设置 labels=False 即可。


ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年龄数据
pd.cut(ages, [0,5,20,30,50,100], labels=False)

输出:

array([0, 0, 1, 3, 3, 1, 4, 4, 4, 4, 4, 1, 1, 2, 2, 3], dtype=int64)

上述输出中的第一个 0 表示第一个数据点位于第 0 个 bin 中。

参考

1.https://pandas.pydata.org/pandas-docs/version/0.23.4/generated/pandas.cut.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。