pandas.cut 离散化分箱函数详解与实战
本文详细介绍 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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













