Python pandas分箱操作详解:pd.cut与pd.qcut实现连续数据离散化
本文详细介绍如何利用Python的pandas库对连续数据进行离散化处理。重点解析pd.cut和pd.qcut两个核心函数的用法:pd.cut通过指定分界点进行自定义分箱,支持调整区间开闭及自定义标签;pd.qcut则根据指定箱子数量进行等频分箱,确保各箱数据量一致。文章包含具体代码示例与结果分析,适用于数据预处理场景。
pandas分箱处理概述
在Python中,对连续型数据进行离散化(即分箱处理)主要依赖pandas库中的两个关键函数:pandas.cut和pandas.qcut。pandas.cut允许用户根据预先设定的分界点将连续数据划分为不同的区间;而pandas.qcut则是根据指定的箱子数量,对数据进行等频分箱处理,其核心特征是保证每个箱子中包含的数据样本数量相同。
接下来将分别介绍这两个函数的具体使用方法及参数配置。
# 导入pandas包
import pandas as pd
ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32] # 待分箱数据
bins = [18, 25, 35, 60, 100] # 指定箱子的分界点
pd.cut函数详解
首先来看pandas.cut函数的应用。该函数通过接收数据序列和分界点列表,生成分类区间对象。
cats1 = pd.cut(ages, bins)
cats1
执行上述代码后,cats1的结果如下所示,展示了原始数据被映射到的具体区间标签。
[(18, 25], (18, 25], (18, 25], (25, 35], (18, 25], ..., (25, 35], (60, 100], (35, 60],
(35, 60], (25, 35]]
Length: 12
Categories (4, interval[int64]): [(18, 25] < (25, 35] < (35, 60] < (60, 100]]
# labels参数为False时,返回结果中用不同的整数作为箱子的指示符
cats2 = pd.cut(ages, bins,labels=False)
cats2 # 输出结果中的数字对应着不同的箱子
当设置labels=False时,cats2的结果将返回整数索引,这些整数对应于不同的箱子编号,便于后续数值计算。
array([0, 0, 0, 1, 0, 0, 2, 1, 3, 2, 2, 1], dtype=int64)
pd.value_counts(cats1) # 对不同箱子中的数进行计数
通过pd.value_counts()函数,可以统计每个箱子中包含的数据样本数量,结果如下。
(18, 25] 5
(35, 60] 3
(25, 35] 3
(60, 100] 1
dtype: int64
pd.cut(ages, [18, 26, 36, 61, 100], right=False) # 指定分箱区间是左闭右开
此外,可以通过调整bins参数中的right=False来改变区间的开闭性质,例如将默认的左开右闭区间改为左闭右开区间。
[[18, 26), [18, 26), [18, 26), [26, 36), [18, 26), ..., [26, 36), [61, 100), [36, 61),
[36, 61), [26, 36)]
Length: 12
Categories (4, interval[int64]): [[18, 26) < [26, 36) < [36, 61) < [61, 100)]
# 可以将想要指定给不同箱子的标签传递给labels参数
group_names = ['Youth', 'YoungAdult', 'MiddleAged', 'Senior']
cuts3 = pd.cut(ages, bins, labels=group_names)
cuts3
修改区间开闭属性后,cats3的结果显示区间表示方式变为左闭右开形式,如[18, 26)等。
[Youth, Youth, Youth, YoungAdult, Youth, ..., YoungAdult, Senior, MiddleAged,
MiddleAged, YoungAdult]
Length: 12
Categories (4, object): [Youth < YoungAdult < MiddleAged < Senior]
pd.qcut函数详解
接下来介绍pandas.qcut函数。与pd.cut不同,qcut主要关注箱子的数量而非具体的分界点,它通过计算分位数来确定分箱边界。
qcats1 = pd.qcut(ages,q=4) # 参数q指定所分箱子的数量
qcats1
执行qcats1 = pd.qcut(ages, q=4)后,结果如下。这里参数q=4表示将数据分为4个箱子,每个箱子包含大致相同数量的样本。
[(19.999, 22.75], (19.999, 22.75], (22.75, 29.0], (22.75, 29.0], (19.999, 22.75], ...,
(29.0, 38.0], (38.0, 61.0], (38.0, 61.0], (38.0, 61.0], (29.0, 38.0]]
Length: 12
Categories (4, interval[float64]): [(19.999, 22.75] < (22.75, 29.0] < (29.0, 38.0] <
(38.0, 61.0]]
qcats1.value_counts() # 从输出结果可以看到每个箱子中的数据量时相同的
通过value_counts()查看计数结果,可以验证每个箱子中的数据量是相等的,具体统计如下。
(19.999, 22.75] 3
(22.75, 29.0] 3
(29.0, 38.0] 3
(38.0, 61.0] 3
dtype: int64
参考来源:《利用Python进行数据分析》——Wes McKinney 第二版。
以上即为使用pandas实现连续数据离散化处理(分箱操作)的完整内容。希望这些示例能为您提供参考,欢迎继续支持本站获取更多技术分享。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









