分箱是一种常见的数据预处理技术有时也被称为分桶或离散化,他可用于将连续数据的间隔分组到“箱”或“桶”中。在本文中,我们将讨论使用 python Pandas 库对数值进行分箱的 4 种方法。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yh8qGzOI-1651545800864)(http://images.overfit.cn/upload/20220503/4e8aeb2f82a54719bac9ee6c30407321.jpeg)]

我们创建以下合成数据用于演示

import pandas as pd # version 1.3.5
import numpy as np
def create_df():
df = pd.DataFrame({'score': np.random.randint(0,101,1000)})
return dfcreate_df()
df.head()

数据包括 1000 名学生的 0 到 100 分的考试分数。而这次的任务是将数字分数分为值“A”、“B”和“C”的等级,其中“A”是最好的,“C”是最差的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wvCkxexs-1651545800865)(http://images.overfit.cn/upload/20220503/caa3faf567ed4773af3d83ce06da9583.png)]

1、between & loc

Pandas .between 方法返回一个包含 True 的布尔向量,用来对应的 Series 元素位于边界值 left 和 right[1] 之间。

参数有下面三个:

  • left:左边界
  • right:右边界
  • inclusive:要包括哪个边界。可接受的值为 {“both”、“neither”、“left”、“right”}。

根据以下间隔规则将学生的分数分为等级:

  • A: (80, 100]
  • B: (50, 80]
  • C: [0, 50]

其中方括号 [ 和圆括号 ) 分别表示边界值是包含的和不包含的。我们需要确定哪个分数在感兴趣的区间之间,并为其分配相应的等级值。注意看下面的不同的参数表示是否包含边界

df.loc[df['score'].between(0, 50, 'both'), 'grade'] = 'C'
df.loc[df['score'].between(50, 80, 'right'), 'grade'] = 'B'
df.loc[df['score'].between(80, 100, 'right'), 'grade'] = 'A'

以下是每个分数区间的人数:

df.grade.value_counts()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qtJkYUgs-1651545800865)(http://images.overfit.cn/upload/20220503/ad43ae48f9d64504971978153ec8e8e6.png)]

此方法需要为每个 bin 编写处理的代码,因此它仅适用于 bin 很少的情况。

2、cut

可以使用 cut将值分类为离散的间隔。此函数对于从连续变量到分类变量[2] 也很有用。

cut的参数如下:

  • x:要分箱的数组。必须是一维的。
  • bins:标量序列:定义允许非均匀宽度的 bin 边缘。
  • labels:指定返回的 bin 的标签。必须与上面的 bins 参数长度相同。
  • include_lowest: (bool) 第一个区间是否应该是左包含的。
bins = [0, 50, 80, 100]
labels = ['C', 'B', 'A']
df['grade'] = pd.cut(x = df['score'], bins = bins, labels = labels, include_lowest = True)

这样就创建一个包含 bin 边界值的 bins 列表和一个包含相应 bin 标签的标签列表。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h9yLOk2A-1651545800865)(http://images.overfit.cn/upload/20220503/22643a3ef4ca4cc3ad7f3073d504f341.png)]

查看每个区段的人数

df.grade.value_counts()

结果与上面示例相同。

3、qcut

qcut可以根据排名或基于样本分位数将变量离散为大小相等的桶[3]。

在前面的示例中,我们为每个级别定义了分数间隔,这回使每个级别的学生数量不均匀。在下面的示例中,我们将尝试将学生分类为 3 个具有相等(大约)数量的分数等级。示例中有 1000 名学生,因此每个分箱应该有大约 333 名学生。

qcut参数:

x:要分箱的输入数组。必须是一维的。

q:分位数。10 表示十分位数,4 表示四分位数等。也可以是交替排列的分位数,例如[0, .25, .5, .75, 1.] 四分位数。

labels:指定 bin 的标签。必须与生成的 bin 长度相同。

retbins: (bool) 是否返回 (bins, labels)。

df['grade'], cut_bin = pd.qcut(df['score'], q = 3, labels = ['C', 'B', 'A'], retbins = True)
df.head()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3rAmNJDu-1651545800866)(http://images.overfit.cn/upload/20220503/ae91808d9664428ba2b8df86d9a08f0a.png)]

如果 retbins 设置为 True 则会返回 bin 边界。

print (cut_bin)
>> [  0.  36.  68. 100.]

分数间隔如下:

  • C:[0, 36]
  • B:(36, 68]
  • A:(68, 100]

使用 .value_counts() 检查每个等级有多少学生。理想情况下,每个箱应该有大约 333 名学生。

df.grade.value_counts()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dpEhEvAT-1651545800867)(http://images.overfit.cn/upload/20220503/3b4d2c2495d04883b6cf27dce091f8f9.png)]

4、value_counts

虽然 pandas .value_counts 通常用于计算系列中唯一值的数量,但它也可用于使用 bins 参数 [4] 将值分组到半开箱中。

df['score'].value_counts(bins = 3, sort = False)

默认情况下, .value_counts 按值的降序对返回的系列进行排序。将 sort 设置为 False 以按其索引的升序对系列进行排序。

series 索引是指每个 bin 的区间范围,其中方括号 [ 和圆括号 ) 分别表示边界值是包含的和不包含的。返回series 的值表示每个 bin 中有多少条记录。

与 .qcut 不同,每个 bin 中的记录数不一定相同(大约)。.value_counts 不会将相同数量的记录分配到相同的类别中,而是根据最高和最低分数将分数范围分成 3 个相等的部分。分数的最小值为 0,最大值为 100,因此这 3 个部分中的每一个都大约在 33.33 范围内。这也解释了为什么 bin 的边界是 33.33 的倍数。

我们还可以通过传入边界列表来定义 bin 边界。

df['score'].value_counts(bins = [0,50,80,100], sort = False)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zHKLYWkh-1651545800867)(http://images.overfit.cn/upload/20220503/77ebaf96d4f74166b2762a2a43e591a6.png)]

这给了我们与示例 1 和 2 相同的结果。

总结

在本文中,介绍了如何使用 .between、.cut、.qcut 和 .value_counts 对连续值进行分箱。这里是本文的源代码:

https://avoid.overfit.cn/post/dc11c84491e841dea928d652f0f93005

作者:Edwin Tan

Pandas 对数值进行分箱操作的4种方法总结对比相关推荐

  1. 【Python】使用Pandas对数值进行分箱操作的4种方法

    使用Pandas对数值进行分箱操作的4种方法 方法1:between & loc 方法2:cut 方法3:qcut 方法4:value_counts 补充材料 分箱是一种常见的数据预处理技术, ...

  2. python 数据处理之分箱操作

    什么是分箱? 简单点说就是将不同的东西,按照特定的条件放到一个指定容器里,比如水果 把绿色的放一个篮子里,红色一个篮子等等,这个篮子就是箱,而水果就是数据 颜色就是条件 什么样式的数据要进行分箱 数据 ...

  3. 在职位招聘数据处理中使用Loess回归曲线以及分箱、回归、聚类方法 检查离群点及光滑数据【数据挖掘机器学习】

    文章目录 一.需求分析 二.使用局部回归(Loess)曲线(增加一条光滑曲线到散布图)方法处理数据 三.使用分箱.回归.聚类方法 检查离群点及光滑数据: 一.需求分析 本文主题:使用局部回归(Loes ...

  4. Php 链式执行,PHP实现链式操作的三种方法详解

    本文实例讲述了PHP实现链式操作的三种方法.分享给大家供大家参考,具体如下: 在php中有很多字符串函数,例如要先过滤字符串收尾的空格,再求出其长度,一般的写法是: strlen(trim($str) ...

  5. Bean的生命周期行为控制,初始化与销毁bean时执行操作的三种方法

    Bean的生命周期行为控制,初始化与销毁bean时执行操作的三种方法 一.实现Spring的接口 二.XML配置中使用 init-method和destory-method 三.使用@PostCons ...

  6. 数据预处理的分箱操作

    介绍 我们在建立模型前,一般需要对特征变量进行离散化,特征离散化后,模型会更稳定,降低模型过拟合的风险.尤其是采用 logsitic 建立评分卡模型时,必须对连续变量进行离散化.而特征离散化处理通常采 ...

  7. pandas 实现等频分箱

    #等频分箱 def frequencybox(demo, name, new_name, n):demo["tmp"] = pd.qcut(demo[name],n)group_b ...

  8. 卡方分箱--基于四格表方法

    import pandas as pd import numpy as npdef ceshi(df,col,target,max_interval=5):colLevels = set(df[col ...

  9. OpenCV-图像像素遍历操作的三种方法对比(程序提速)

    作者:Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 场景需求 使用OpenCV,避免不了的就是对图像像素进行操作,遍历操作更是家常便饭,当图像数据不多时, ...

最新文章

  1. silk 编解码_silk音频编解码C++类
  2. 什么是万词霸屏?做万词霸屏有效果么?
  3. JAVA数据库编程(JDBC技术)-入门笔记
  4. 全国汽车牌照号详解细表(各省市区)
  5. c语言将程序写为动态库,VS下生成C程序静态库(LIB)及动态库(DLL)的方法
  6. 职场老油条靠它升职后:还用Excel手动做报表?想想就可笑
  7. 详解NLP和时序预测的相似性【附赠AAAI21最佳论文INFORMER的详细解析】
  8. mysql mvc javascript_MVC中用Jquery、JS和Ajax 实现分页 存储过程是用mysql写的。
  9. 有哪些关于iPhone使用的小技巧?
  10. [NOIP2015] 运输计划
  11. Python items()方法
  12. 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux内核抢占实现机制分析...
  13. 实现了某一个接口的匿名类的例子_“全栈2019”Java多线程第三章:创建多线程之实现Runnable接口...
  14. ActiveMQ 下载和安装
  15. osg-04-基本几何图元-线宽
  16. 高股息组合与指数基金谁好?
  17. matlab如何生成极坐标,如何在matlab中极坐标画图
  18. 分数化小数 Fractions to Decimals [USACO 2.4]
  19. odoo:开源 ERP/CRM 入门与实践
  20. OpenYurt 在龙源 CNStack 云边协同项目的应用

热门文章

  1. adb shell am broadcast 发送广播
  2. 内存不兼容,升级BIOS
  3. 数控车椭圆编程实例带图_如何在数控车中对斜椭圆进行编程与加工
  4. 移动互联网时代,微营销该怎么做?
  5. 三星手机电池循环清零代码_巅峰对决申真谞离奇“滑标” 三星杯决赛首局柯洁轻松告捷...
  6. mui可否使用php网页,使用MUI框架如何加载外部网页或服务器数据
  7. WiFi信号感知精度
  8. HTML:列表文字颜色与列表嵌套
  9. S32 Design Studio for ARM 2.2 快速入门
  10. Idea 如何安装插件