当前位置: 首页 > article >正文

【分箱基础篇】pandas 分箱双子星:pd.cut 与 pd.qcut

进阶篇参考【分箱进阶篇】分箱的工程细节从训练到部署的完整模式拿到一列连续数值年龄、收入、交易金额等第一步常常是分箱也就是把连续值映射到几个离散区间。pandas 提供了两个内置函数干这件事pd.cut等距和pd.qcut等频。名字只差一个字母行为却截然不同搞混了会在特征工程阶段埋下隐蔽的坑。​ 这篇从最基础的用法讲起把两个函数的参数、返回值、边界行为全部讲清楚。一、最小示例一眼看出区别importpandasaspdimportnumpyasnp spd.Series([1,5,10,15,30,50,100])1.1 等距分箱​ 等距分 3 箱按值域均匀切割pd.cut(s,bins3)0 (0.901, 34.0] 1 (0.901, 34.0] 2 (0.901, 34.0] 3 (0.901, 34.0] 4 (0.901, 34.0] 5 (34.0, 67.0] 6 (67.0, 100.0] dtype: category Categories (3, interval[float64, right]): [(0.901, 34.0] (34.0, 67.0] (67.0, 100.0]]​ 可以看到前5个值都在第一个箱子里后两个箱子中各占 1 个。因为cut把[1, 100]的值域等分成三段不管每段里有多少数据。1.2 等频分箱​ 等频分 3 箱按数据量均匀切割pd.qcut(s,q3)0(0.999,10.0]1(0.999,10.0]2(10.0,30.0]3(10.0,30.0]4(30.0,100.0]5(30.0,100.0]6(30.0,100.0]dtype: category Categories(3, interval[float64, right]):[(0.999,10.0](10.0,30.0](30.0,100.0]]​ 可以看到每个箱里大约 2~3 个值。qcut找的是分位数切分点目标是让每个箱的样本数尽量相等。1.3 直观对比​ 等距分箱(cut)关心值域均匀等频分箱(qcut) 关心样本量均匀。数据分布越偏斜两者差异越大。二、pd.cut 详解2.1 签名与核心参数pd.cut(x,bins,rightTrue,labelsNone,retbinsFalse,precision3,include_lowestFalse,duplicatesraise)(1)bins​bins是最关键的参数支持三种形式。形式一整数binsN表明等距分N NN箱pd.cut(s,bins4)实际项目中不常见。形式二列表bins edges_list按照自定义切分点列表分箱pd.cut(s,bins[0,18,35,60,100])实际项目中用得最多的因为业务上通常有明确的分段逻辑比如年龄分为未成年/青年/中年/老年。(2)right​right控制区间开闭方向。默认True区间是左开右闭(a, b]pd.cut([10,20,30],bins[0,10,20,30])输出[(0,10],(10,20],(20,30]]Categories(3, interval[int64, right]):[(0,10](10,20](20,30]]​ 设为False则变成左闭右开[a, b)。pd.cut([10,20,30],bins[0,10,20,30],rightFalse)输出[[10.0,20.0),[20.0,30.0), NaN]Categories(3, interval[int64, left]):[[0,10)[10,20)[20,30)]​ 不管怎么设最外侧那个端点默认不包含第一个箱左端点是开的或最后一个箱右端点是开的。这就是include_lowest存在的原因。(3)include_lowest​ 把第一个箱的左端点从开区间变成闭区间。​ 当rightTrue时默认行为是(0, 10]值恰好等于 0 会变成 NaN。pd.cut([0,10,20,30],bins[0,10,20,30])输出[NaN,(0.0,10.0],(10.0,20.0],(20.0,30.0]]Categories(3, interval[int64, right]):[(0,10](10,20](20,30]]​ 加上include_lowestTrue后变成[0, 10]实际显示为(-0.001, 10]0 就能被收进去。pd.cut([0,10,20,30],bins[0,10,20,30],include_lowestTrue)输出[(-0.001,10.0],(-0.001,10.0],(10.0,20.0],(20.0,30.0]]Categories(3, interval[float64, right]):[(-0.001,10.0](10.0,20.0](20.0,30.0]](4)labels​ 给区间贴自定义标签注意数量必须等于箱数。agespd.Series([1,5,30,50,80,100])ages_binspd.cut(ages,bins[0,18,35,60,100],labels[未成年,青年,中年,老年])ages_bins_dfpd.DataFrame({ages:ages,ages_bins:ages_bins})输出ages ages_bins01未成年15未成年230青年350中年480老年5100老年​ 如果将labels参数设置为False 则返回整数编码0, 1, 2, …。ages_bins_numericpd.cut(ages,bins[0,18,35,60,100],labelsFalse)ages_bins_numeric_dfpd.DataFrame({ages:ages,ages_bins:ages_bins_numeric})ages ages_bins01015023013502480351003(5)retbins​ 设置retbinsTrue同时返回切分点数组。对于传入整数bins时特别有用你不用自己算切分点在哪里spd.Series([1,5,10,15,30,50,100])result,edgespd.cut(s,bins3,retbinsTrue)edges[0.90134.67.100.]2.2 返回值结构​pd.cut的返回值有两层结构理解这一点对后续操作很重要。(1) 外层Categorical Series​ pandas 专门用来表示有限类别的数据类型自带类别列表和顺序信息resultpd.cut([15,45,80],bins[0,30,60,100])print(result)print(fresult type {type(result)})print(fresult dtype {result.dtype})Categories(3, interval[int64, right]):[(0,30](30,60](60,100]]resulttypeclasspandas.core.arrays.categorical.Categoricalresult dtypecategory​ 注意orderedTruepandas 知道(0, 30]排在(30, 60]前面。这意味着可以直接比较和排序排序sorted_valuesresult.sort_values()print(fsorted {sorted_values})输出按区间数值顺序排序而不是字典序sorted[(0,30],(30,60],(60,100]]Categories(3, interval[int64, right]):[(0,30](30,60](60,100]]计算最小区间result.min()min(0,30](2) 内层pd.Interval对象​ 内层的每个元素是 pd.Interval 对象它不是字符串而是一个有左右端点的结构print(fresult[0] {result[0]})print(fresult[0] type {type(result[0])})result[0](0,30]result[0]typeclasspandas._libs.interval.Interval可以直接获得左/右边界print(fresult[0] left {result[0].left}) print(fresult[0] right {result[0].right})result[0]left0result[0]right30可以判断某个值是否属于这一区间print(f5 in result[0] ? {5inresult[0]})5inresult[0]?True(3)常见坑转成字符串后顺序丢失​ 一旦.astype(str)Interval 退化成普通字符串排序变成字典序。spd.Series([2,7,50])resultpd.cut(s,bins[0,5,10,100])Categorical排序按数值排序print(f按数值排序{result.sort_values().values})按数值排序[(0,5],(5,10],(10,100]]Categories(3, interval[int64, right]):[(0,5](5,10](10,100]]字符串排序按字典序print(f按字典序排序{result.astype(str).sort_values().values})输出按字典序排序[(0, 5](10, 100](5, 10]]所以在需要保持顺序的场景画图、分组统计中尽量保留 Categorical 类型不要过早转字符串。2.3 值落在区间外​ 如果数据超出了自定义 bins 的范围对应位置返回 NaN不会报错pd.cut([5,50,150],bins[0,30,100])# (0, 30], (30, 100], NaN​ 这里因为分箱边界为( 0 , 30 ] (0, 30](0,30]和( 30 , 100 ] (30, 100](30,100]150 没有对应箱可以放静默变成缺失值。三、pd.qcut 详解3.1 签名与核心参数pd.qcut(x,q,labelsNone,retbinsFalse,precision3,duplicatesraise)​ 比cut少了right、include_lowest、bins这几个参数多了一个q。(1)q​q支持两种形式形式一整数等频分为N NN箱pd.qcut(s,q4)形式二列表指定分位数切分点pd.qcut(s,q[0,0.25,0.75,1.0])# 自定义三箱​ 形式 2 可以做非均匀的分位切割比如把尾部 5% 单独拎出来。​labels、retbins的用法和cut完全一致不再重复。(2) duplicates 参数​ 这是qcut最容易踩的坑。当数据中某个值出现次数太多多到跨越了分位数边界时会产生重复的切分点spd.Series([1,1,1,1,2,3,4,5])pd.qcut(s,q4)# ValueError: Bin edges must be unique​ 8 个值中1出现了4次因此25 分位和 50 分位都落在 1 上切分点重复了。​ 解法是duplicatesdrop自动合并重复的切分点实际箱数会少于请求的qpd.qcut(s,q4,duplicatesdrop)​ 箱数变少意味着等频的约束被放松了。遇到这种情况通常说明数据在某个值上过度集中值得先去看看分布再决定分箱策略。3.2retbins的重要性​qcut的切分点是从数据分布中算出来的你事先不知道具体值。用retbinsTrue把切分点取出来后续才能对新数据复用同样的分箱逻辑_,edgespd.qcut(train[月收入],q5,retbinsTrue,duplicatesdrop)# edges 是一个 numpy 数组比如 [1000, 3200, 5800, 9500, 16000, 80000]# 对测试集复用同样的切分点——注意这里用的是 pd.cut不是 qcutpd.cut(test[月收入],binsedges,include_lowestTrue)​这是一个关键模式qcut只在训练集上调用一次之后所有分箱都用cut 保存的 edges。四、对比总结维度pd.cutpd.qcut切分依据值域均匀等距样本量均匀等频核心参数bins整数/列表q整数/分位数列表切分点来源由值域范围决定或手动指定由数据分位数决定偏斜数据表现部分箱样本极少各箱样本量接近典型用途业务有明确分段逻辑探索性分析、特征工程初始分箱复用方式直接复用bins列表先retbins取出 edges再用cut复用​ 两个函数不是替代关系。实际项目中经常先用qcut探索数据分布、确定初始切分点再根据业务需要用cut做精细调整。

相关文章:

【分箱基础篇】pandas 分箱双子星:pd.cut 与 pd.qcut

进阶篇参考:【分箱进阶篇】分箱的工程细节:从训练到部署的完整模式 拿到一列连续数值:年龄、收入、交易金额等,第一步常常是分箱,也就是把连续值映射到几个离散区间。pandas 提供了两个内置函数干这件事:pd…...

【分箱进阶篇】分箱的工程细节:从训练到部署的完整模式

基础篇参考:【分箱基础篇】pandas 分箱双子星:pd.cut 与 pd.qcut ​ 我们在基础篇讲了 pd.cut 和 pd.qcut 各自怎么用。但在实际项目里,分箱不是调一次函数就完事的。通常来说,训练集上算出来的切分点要保存下来,测试集…...

杰理之spp收发数据处理没有找到的问题处理【篇】

原因:开启#define CONFIG_APP_BT_ENABLE 宏配置后,spp的收发处理的回调默认会被库里面接管,所以在app层是看不到的。...

Obsidian插件管理技巧:从零开始配置你的第二个知识库

Obsidian插件管理技巧:从零开始配置你的第二个知识库 当你已经熟悉了Obsidian的基础操作,并建立了第一个知识库后,很可能会想要创建第二个知识库来管理不同的项目或学习领域。但这时你会发现,新建的知识库并没有自动继承你精心配置…...

Java 25并发模型重构实战:用StructuredTaskScope替代CompletableFuture组合的4种高危写法(附JFR火焰图对比)

第一章:Java 25结构化并发演进全景图Java 25正式将结构化并发(Structured Concurrency)从孵化阶段(JEP 428、437、444)升级为标准特性,标志着JVM平台在并发模型抽象上完成关键跃迁。该机制通过作用域&#…...

DexGraspNet与多指手抓取算法详解:从理论到工程实现

目录 DexGraspNet与多指手抓取算法详解:从理论到工程实现 第一部分:原理详解 第一章 绪论与灵巧抓取的挑战 1.1 机器人抓取技术演进 1.1.1 从平行夹爪到多指灵巧手 1.1.2 灵巧抓取的独特挑战 1.2 DexGraspNet的研究背景与意义 1.2.1 大规模数据驱动的必要性 1.2.2 D…...

计算机毕业设计springboot高校实验室安全巡检系统 基于SpringBoot的高校实验室智能安防监管平台 SpringBoot框架下高校实验楼安全隐患排查与预警系统

计算机毕业设计springboot高校实验室安全巡检系统4p1y5wo9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。随着高等教育规模的持续扩张,高校实验室数量与类型日益增多…...

告别盲目点优化!手把手教你用Zemax 2024构建‘先结构后像差’的高效优化工作流

告别盲目点优化!手把手教你用Zemax 2024构建‘先结构后像差’的高效优化工作流 在光学设计领域,Zemax作为行业标杆工具,其优化功能强大却也让许多设计师陷入"不断点击优化按钮"的困境。真正高效的设计不在于反复试错,而…...

3个变革性步骤:用163MusicLyrics彻底解决歌词获取难题

3个变革性步骤:用163MusicLyrics彻底解决歌词获取难题 【免费下载链接】163MusicLyrics Windows 云音乐歌词获取【网易云、QQ音乐】 项目地址: https://gitcode.com/GitHub_Trending/16/163MusicLyrics 在数字化音乐时代,歌词已不再是简单的文字附…...

MOOTDX终极指南:Python通达信数据接口让量化分析变得简单高效

MOOTDX终极指南:Python通达信数据接口让量化分析变得简单高效 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 你是否曾为获取股票数据而烦恼?面对复杂的API接口和繁琐的数据…...

终极指南:ComfyUI-LTXVideo深度解析与高效视频生成实战

终极指南:ComfyUI-LTXVideo深度解析与高效视频生成实战 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo ComfyUI-LTXVideo 是专为LTX-2视频生成模型设计的强大ComfyUI…...

FRCRN开源模型部署指南:国产昇腾Ascend 910B适配与性能实测

FRCRN开源模型部署指南:国产昇腾Ascend 910B适配与性能实测 1. 项目概述与背景 FRCRN(Frequency-Recurrent Convolutional Recurrent Network)是阿里巴巴达摩院在ModelScope社区开源的单通道语音降噪模型,专门针对16kHz采样率的…...

破局 AIGC 检测重围:PaperXie 如何让论文从 “机器量产“ 回归 “学术原创“——3000 字深度解构双效降重新范式

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AIPPThttps://www.paperxie.cn/weight?type1https://www.paperxie.cn/weight?type1 引言:当学术写作撞上 AIGC 检测,毕业与投稿的双重困局凌晨两点的图书馆,屏幕上刺眼…...

实测避坑:用华为Atlas 300I DUO推理卡跑Qwen1.5-14B,性能对比3090和配置踩坑全记录

华为Atlas 300I DUO推理卡实战评测:Qwen1.5-14B部署全流程与性能深度对比 当国产AI加速卡遇上千亿参数大模型,会碰撞出怎样的火花?最近半年,我陆续测试了市面上主流的7款推理加速设备,这次终于轮到华为Atlas 300I DUO这…...

PyTorch Geometric安装避坑指南:从CUDA版本选择到依赖包自动安装的完整流程

PyTorch Geometric工程化安装指南:从版本匹配到环境复现的深度实践 在深度学习领域,图神经网络(GNN)正成为处理非欧几里得数据的利器,而PyTorch Geometric(PyG)作为最受欢迎的GNN框架之一,其安装过程却常让开发者陷入"依赖地…...

开源字体破局者:思源宋体TTF的免费商用解决方案

开源字体破局者:思源宋体TTF的免费商用解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 在数字设计领域,寻找兼具专业品质与商业授权的中文字体一直是设…...

Cursor试用限制终极解决方案:一篇文章彻底解决你的AI编程困境

Cursor试用限制终极解决方案:一篇文章彻底解决你的AI编程困境 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to p…...

KEITHLEY 6221+2182A组合在霍尔测量中的5个实战技巧(避坑指南)

KEITHLEY 62212182A组合在霍尔测量中的5个实战技巧(避坑指南) 霍尔测量作为材料科学研究中的关键手段,对仪器精度和操作细节的要求近乎苛刻。KEITHLEY 6221电流源与2182A纳伏表的组合,凭借其出色的低噪声性能和微电流处理能力&…...

为什么大厂都不用 Apache 了?Nginx 反向代理才是微服务入口

一、前言本文将带大家全面认识Nginx:它是什么、为什么能成为行业主流、核心优势有哪些、能解决哪些实际业务问题,以及和我们熟悉的Apache服务器有什么区别。二、什么是Nginx?Nginx(发音为“engine x”)是由俄罗斯程序员…...

微信小程序蓝牙打印中文乱码?手把手教你GBK编码转换(附完整Demo)

微信小程序蓝牙打印中文乱码终极解决方案:从编码原理到完整实现 蓝牙打印机在零售、餐饮等行业的应用越来越广泛,而微信小程序作为轻量级应用平台,与蓝牙打印机的结合为商家提供了便捷的移动打印方案。但在实际开发中,开发者经常会…...

提升开发体验:LxgwWenKai开源字体效率优化指南

提升开发体验:LxgwWenKai开源字体效率优化指南 【免费下载链接】LxgwWenKai LxgwWenKai: 这是一个开源的中文字体项目,提供了多种版本的字体文件,适用于不同的使用场景,包括屏幕阅读、轻便版、GB规范字形和TC旧字形版。 项目地址…...

OpenClaw性能优化:nanobot镜像响应速度提升50%

OpenClaw性能优化:nanobot镜像响应速度提升50% 1. 为什么需要优化nanobot镜像性能 第一次使用nanobot镜像时,我就被它的轻量级特性吸引——基于Qwen3-4B-Instruct-2507模型,却能跑在我的开发笔记本上。但实际使用中发现,当连续处…...

别再只防SSH了!给OpenWRT的Web管理后台LuCI也加上fail2ban防护(附日志配置避坑指南)

OpenWRT安全加固:为LuCI管理界面部署fail2ban防护的完整方案 路由器作为家庭网络的入口,其安全性往往被严重低估。大多数用户会记得给SSH服务配置fail2ban防护,却忽略了同样暴露在公网的Web管理界面——LuCI。这种安全防护的"偏科"…...

无人机海上搜救数据集 海上搜救人员识别 违规游泳识别 无人艇自主导航数据集 海洋安全监控及水上救援预警等场景 深度学习yolo格式地10625期

海洋目标检测数据集 README 项目概述 本数据集聚焦于海洋场景下的目标识别与安全监测任务,为海上搜救、智能无人艇导航及海洋环境监控等领域提供高质量标注数据,助力海洋视觉感知技术的落地应用。核心数据信息维度内容数据类别共5类:船只、浮…...

如何用RecastNavigation构建高效AI导航系统:5个实战技巧揭秘

如何用RecastNavigation构建高效AI导航系统:5个实战技巧揭秘 【免费下载链接】recastnavigation Navigation-mesh Toolset for Games 项目地址: https://gitcode.com/gh_mirrors/re/recastnavigation 你是否曾为游戏中的AI角色设计路径规划而头疼&#xff1f…...

springboot+vue基于web的针对老年人的景区订票系统的设计与实现

目录系统功能模块划分关键技术实现特殊考量因素项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统功能模块划分 用户端功能(老年人友好设计) 注册登录:支持手机号验证、子女代注册、大字体…...

3分钟零基础入门:GPU加速MediaPipe TouchDesigner插件完整指南

3分钟零基础入门:GPU加速MediaPipe TouchDesigner插件完整指南 【免费下载链接】mediapipe-touchdesigner GPU Accelerated MediaPipe Plugin for TouchDesigner 项目地址: https://gitcode.com/gh_mirrors/me/mediapipe-touchdesigner 你是否曾想过在TouchD…...

批量视频加图片水印工具使用指南

软件简介批量视频加图片水印工具是一款桌面端视频水印批量添加工具,支持单张/多张水印、九宫格固定位置、四种随机位置模式、大小和透明度调节、时间间隔水印等功能。核心功能功能说明单张水印所有视频使用同一张水印图片多张随机水印从水印文件夹中随机选择水印图片…...

思源宋体TTF:免费商用中文字体的终极解决方案

思源宋体TTF:免费商用中文字体的终极解决方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为寻找高质量且免费商用的中文字体而烦恼吗?思源宋体TTF格式为…...

别再只用DataParallel了!PyTorch单机多卡训练保姆级教程(从DP到DDP实战避坑)

从DataParallel到DDP:PyTorch单机多卡训练深度优化指南 当你的模型参数突破1亿大关,单卡训练时间从几小时延长到几天时,多GPU并行训练就从一个可选项变成了必选项。但面对PyTorch提供的DataParallel(DP)和DistributedDataParallel(DDP)两种方…...