Pandas分箱/离散化cut()与qcut()的区别

cut与qcut区别

      • 1、pd.cut()
      • 2、pd.qcut()
      • 3、cut与qcut区别




Pandas提供了智能剪贴功能:pd.cut()pd.qcut(),它们通常用于更方便直观地处理关系型或标签型数据,将数据进行分箱/离散化

1、pd.cut()


我们可以通过两种方式使用cut()函数:直接指定bin的数量,让Pandas为我们计算等大小的bin,或者我们可以按照自己的意愿手动指定bin的边缘

cut()函数中,bin边缘的间距大小是相等的,每个bin或箱中的元素数量不均匀。例如,如果对年龄进行分箱,0-1岁是婴儿,1-12岁是孩子,12-18岁是青少年,18-60岁是成年人,60岁以上是老年人。所以我们可以设置:

bins=[0, 1, 12, 18, 60, 140]
labels=['infant', 'kid', 'teenager', 'grownup', 'senior citizen']

cut()的API如下:

pd.cut(x,bins,right,labels,retbins,precision,include_lowest,duplicates,ordered)

其参数及说明如下:

  • x:需要进行分箱的数据,1D数组或系列类型,如果数据存在NaN则报错
  • bins:分箱的边界,如果是单个整数,则表示基于数据中的最小值和最大值生成等间距间隔;也可以是自定义边界值的列表或数组
  • right:是否包含最右边的数值,默认为True(右闭)
  • labels:分箱的标签,长度保持与分箱数一致
  • retbins:是否显示分箱的边界值,默认为False。当bins为整数时设置True可以显示边界值
  • precision:分箱边界的精度,默认3位小数
  • include_lowest:是否包含最左边的数值,默认为False(左开)
  • duplicates:默认为raise,如果分箱的边界不唯一,则引发ValueError;指定drop则去重
  • ordered:标签是否有序,默认为True,分类结果将被排序

以下是一个使用示例:

import pandas as pd
import numpy as np# 数据准备
years = [2024, 2023, 2017, 2011, 2015, 2023, 2008, 2010]
df = pd.DataFrame(years, columns=['Year'])

基本使用如下:

# 左开右闭
print(pd.cut(df['Year'], bins=3, precision=0))

在这里插入图片描述
数据的年份范围是2008年到2024年(16个),当我们指定bins=3时,Pandas将它切分成3个等宽的bin,每个bin5-6年。需要注意的是,Pandas会自动将第一类的下限值丢失精度,以确保将2008年也包括在结果中

# 左闭右闭
print(pd.cut(df['Year'], bins=3, include_lowest=True, precision=0))

在这里插入图片描述

可以将标签参数指定为一个列表,而不是获得间隔,以便更好地分析:

# 指定分类标签
df['Label'] = pd.cut(df['Year'], bins=3, labels=['Old', 'Medium', 'New'], precision=0)
print(df)

在这里插入图片描述
如果指定labels=False,我们将得到bin的数字表示(从0依次开始递增):

df['Label'] = pd.cut(df['Year'], bins=3, labels=False)
print(df)

在这里插入图片描述
查看每个分箱中的值数量:

print(df['Label'].value_counts().reset_index())

在这里插入图片描述
显示分箱的边界值:

# 我们可以指定retbins=True一次性获得bin区间和边界值离散的序列,此时方法返回一个二元组
cut_series, cut_intervals = pd.cut(df['Year'], bins=3, retbins=True, precision=0)
# bin区间
print(cut_series)
# 分箱的边界值
print(cut_intervals)

在这里插入图片描述
我们也可以通过给bins参数传入一个列表来手动指定bin的边缘:

# 自定义bin边缘
print(pd.cut(df['Year'], bins=[2008, 2010, 2020, 2024], include_lowest=True))

在这里插入图片描述
这里,我们设置了include_lowest=True,默认情况下,它被设置为False,因此,当Pandas看到我们传递的列表时,它将把2008年排除在计算之外。因此,这里我们也可以使用任何小于2008的值

2、pd.qcut()


qcut()函数(Quantile-Cut)与cut()的关键区别在于,在qcut()中,每个bin中的元素数量将大致相同,但这将以不同大小的bin区间宽度为代价

qcut()函数中,当我们指定q=5时,我们告诉Pandas将数据列切成5个相等的量级,即0-20%,20-40%,40-60%,60-80%和80-100%桶/箱

qcut()的API如下:

pd.qcut(x,q,labels,retbins,precision,duplicates)

其参数及说明如下:

  • x:需要进行分箱的数据,1D数组或系列类型,如果数据存在NaN则保留
  • q:分位数,例如4用于四分位,也可以指定为列表[0,0.25,0.5,0.75,1]
  • 其他参数:同pd.cut()

给数据注入一个缺失值,我们看下qcut()将如何处理一个包含NaN的数据集

# 添加NaN值
df.loc[0, 'Year'] = np.NaN

以下是一个使用示例:

# 左开右闭
print(pd.qcut(df['Year'], q=3))

在这里插入图片描述
你是否注意到,在输出结果中,NaN值也被保留为NaN?

指定分箱标签:

# 指定分箱标签
df['Label'] = pd.qcut(df['Year'], q=3, labels=['Old', 'Medium', 'New'])
print(df)

在这里插入图片描述
自定义分箱量级:

# 自定义分箱量级
print(pd.qcut(df['Year'], q=[0, 1 / 3, 2 / 3, 1]))

在这里插入图片描述
可以看到,分箱的边缘是不等宽的,因为它要容纳每个桶1/3的值,因此它要自己计算每个箱子的宽度来实现这一目标

3、cut与qcut区别


综上所述,现对cut()qcut()方法的使用区别作如下总结:

  • cut()分箱边缘是等间距的,因此,箱中的元素数量不均;qcut()分箱箱中的元素数量是均匀的,因此,箱边缘不是等间距的
  • cut()分箱数据如果存在NaN则报错;qcut()分箱则将存在的NaN保留


参考文章:https://geek-docs.com/pandas/pandas-tutorials/how-to-use-pandas-cut-and-qcut.html


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/600855.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

废品回收小程序推动回收行业的发展趋势

回收在全球都是一个重要行业,它为全球的环保作出了重要贡献。 随着科技的不断发展创新,废品回收的方式也逐渐多样,全新的线上回收小程序也逐渐出现在大众的生活中,在当下的手机时代,线上回收也为大众提供了更加便利的…

安全升级,智能领航:RFID技术推动铁路锁控系统进入新时代

随着我国铁路运输行业的快速发展,铁路安全运营的重要性日益凸显,为了提高铁路运输安全性,降低人为操作失误,航连科技提出了一种基于RFID技术的铁路智能锁控系统解决方案,旨在为我国铁路安全运营提供有力支持。 一、系统…

Windows深度学习环境----Cuda version 10.2 pytorch3d version 0.3.0

Requirements Python version 3.8.5Pytorch version: pytorch1.6.0 torchvision0.8.2 torchaudio0.7.0 cudatoolkit10.2.89pytorch3d version 0.3.0Cuda version 10.2 感觉readme文件里的不适配,跟pytorch官网不同 以前的 PyTorch 版本 |PyTorch的 # CUDA 10.2 c…

【IPV6】--- IPV6过渡技术之6 over 4隧道配置

1. IPV4和IPV6有什么区别? 2. IPV6如何在设备上配置? 3. IPV4和IPV6如何跨协议实现通信? 1. IPV4和IPV6 --- IPV6技术 - IP协议第六版 - 128位二进制数 - 2^12843亿*43亿*43亿*43亿 --- IPV4技术 - IP协议第四版 - 192.1…

演示I2C、SPI、UART的通信过程

** 到目前为止,I2C、SPI和UART等仍然是电子嵌入式设备中最常用的通信协议。本文将剖析这三种协议,让大家清楚、直观地了解它们的功能、优点和局限性,并辅以GIF动图展示。** 一、I2C协议 I2C是一种串行通信协议,通常用于连接低速…

java集合总结

集合 一种装数据的容器,类似于数组,但大小可变 主要用途: 1,提供不同数据结构:java提供了不同类型的集合,每一种集合类的数据结构不同导致其特点和使用场景也不同,开发人员可以通过具体的需求选择合适的数据结构来提高程序的效率和性能. 2,方便的数据操作:java集合提供了丰…

Qt判断一个点在多边形内还是外(支持凸边形和凹变形)

Qt判断一个点在多边形内还是外(支持凸边形和凹变形)_qt 判断点是否在多边形内-CSDN博客 这里实现的方法是转载于https://blog.csdn.net/trj14/article/details/43190653和https://blog.csdn.net/WilliamSun0122/article/details/77994526 来实现的&…

24考研-东南大学916经验贴

文章目录 一、个人情况二、初试备考经验1.政治 67,客观382.英语 60,客观大概40左右3.数学 136,客观应该满分4.专业课 数据结构计网 114小分不清楚 三、复试备考经验笔试:C面试复试流程 附一下成绩单: 一、个人情况 本…

vue 中使 date/time/datetime 类型的 input 支持 placeholder 方法

一般在开发时,设置了 date/time/datetime 等类型的 input 属性 placeholder 提示文本时, 发现实际展示中却并不生效,如图: 处理后效果如图: 处理逻辑 判断表单项未设置值时,则设置其伪类样式,文…

postgresql发布和订阅

一、发布订阅介绍 发布和订阅使用了pg的逻辑复制的功能,通过发布端创建publication与表绑定,订阅端创建subscription同时会在发布端创建逻辑复制槽实现逻辑复制功能 逻辑复制基于 发布(Publication) 与 订阅(Subscri…

低代码平台种草推荐

告别繁琐,拥抱未来!只需简单拖拽,Vue代码即刻生成,一键下载,轻松上手。我们的低代码平台,不仅高效便捷,更完全开源,让你自由探索编程的无限可能! 下载网址:ht…

three.js零基础入门超全超细的教程整理(一)

事情是这样的: 有一天 我干完活 看技术文章 发现了three.js 诶!这玩应挺有意思 盘盘 于是第一天找教程 上官网 初上手 第二天 找案例 渲模型 试VR 第三天 捋文档 然后来活了 没时间捋了 下面是集百家精华教程的整理总结 涉及到教程方面有加源作者和地址…