京公网安备 11010802034615号
经营许可证编号:京B2-20210330
pythonshujuqingxi/' style='color:#000;font-size:inherit;'>python数据清洗功能非常强大,相信很多进行数据处理工作的小伙伴都遇到过这种需求,比如已经有了各个销售员的销售业绩,现在需要给各个销售业绩进行一个分档,诸如未完成任务,完成任务,超额完成任务等。要完成分档需要先对销售业绩的数值进行判断,然后再根据判断的结果进行一个分类,那么大家都是怎样进行分类的呢?
实际上,上述需求是要对连续型的数值进行分箱操作,实现的方法有N种,但是效率有高有低,这里我们介绍两种效率比较高而且也容易理解的方法。
先来看一下这个函数都包含有哪些参数,主要参数的含义与作用都是什么?
pd.cut(
x,
bins,
right=True,
labels=None,
retbins=False,
precision=3,
include_lowest=False,
duplicates='raise',
)
x : 一维数组(对应前边例子中提到的销售业绩)
bins :整数,标量序列或者间隔索引,是进行分组的依据,
right :布尔值,默认为True表示包含最右侧的数值
labels : 数组或布尔值,可选.指定分箱的标签
retbins: 是否显示分箱的分界值。默认为False,当bins取整数时可以设置retbins=True以显示分界值,得到划分后的区间
precision:整数,默认3,存储和显示分箱标签的精度。
include_lowest:布尔值,表示区间的左边是开还是闭,默认为false,也就是不包含区间左边。
duplicates:如果分箱临界值不唯一,则引发ValueError或丢弃非唯一
ok,所有参数的含义与作用就是这些了,纯文字解释怎么都不如代码跑一遍来的直观,我们在代码中实现一下再结合上述文字解释就很容易理解了。而且并不是所有参数都是常用的,有些参数很少用到!
先来看一下数据源
df_f = pd.read_excel(r"D:\data\football\球队排名比分2019.xlsx") df_f
读入的数据是2019年英超各球队的积分:
bins取整数,即指定箱子个数
我们对积分数据进行分箱,先来最简单的:
pd.cut(df_f.积分,bins=3,labels=["低","中","高"]) #分成3箱并指定标签
分箱结果:
0 高 1 高 2 中 3 中 4 中 5 中 6 中 7 中 8 低 9 低 10 低 11 低 12 低 13 低 14 低 15 低 16 低 17 低 18 低 19 低 Name: 积分, dtype: category Categories (3, object): [低 < 中 < 高]
直接指定箱子个数,分成等宽的3份,感兴趣的同学可以求一下每个箱子内的极值,应该是约相等的。
前边有提到,这种分箱方式看不到分界值是多少,但是可以通过参数进行设置显示分界值:
pd.cut(df_f.积分,3,labels=["低","中","高"],retbins=True) #retbins=True显示分界值
分箱结果:
(0 高 1 高 2 中 3 中 4 中 5 中 6 中 7 中 8 低 9 低 10 低 11 低 12 低 13 低 14 低 15 低 16 低 17 低 18 低 19 低 Name: 积分, dtype: category Categories (3, object): [低 < 中 < 高], array([13.953 , 29.66666667, 45.33333333, 61. ]))
是不是能明显的看出和上一次代码结果相比多了一个 array([13.953 , 29.66666667, 45.33333333, 61. ]),这就是分箱的分界值啦,我们就能知道分箱的时候是以那个数值作为分界点进行分箱的了。
如果不指定每个箱子的标签是什么
pd.cut(df_f.积分,3,labels=False) #只显示数据位于第几个箱子里
分享结果:
0 2 1 2 2 1 3 1 4 1 5 1 6 1 7 1 8 0 9 0 10 0 11 0 12 0 13 0 14 0 15 0 16 0 17 0 18 0 19 0 Name: 积分, dtype: int64
只显示每个位置上的数值属于第几个箱子
**bins取标量序列 **
pd.cut(df_f.积分,[0,30,40,70],labels=["低","中","高"]) #默认right = True
指定分箱时候的分界点,即030,3040,40~70一共三个箱体,有默认的right = True,即分箱的时候,30包含在030的箱体中,40包含在3040的箱体中,70包含在40~70的箱体中,我们来看下结果,是不是和描述一致:
这里红框部分是要和下边更改参数right后的结果进行对比的,我们来看下:
pd.cut(df_f.积分,[0,30,40,70],labels=["低","中","高"],right=False)
分箱结果:
能够看到,right参数设置对分箱结果的影响。为什么会有这样的影响呢?我们回顾下我们的原数据:
能够发现分享发生变化的数值正好是我们分箱的临界值,可以通过参数进行设置临界值被划分到哪一边的箱体中。
如果需要将分箱的结果展示在原数据框中,直接赋值一列进去就可以了:
df_f.loc[:,"积分等级"]=pd.cut(df_f.积分,[0,30,40,70],labels=["低","中","高"],right=False) df_f
结果如下:
pd.qcut()也可以对数据进行分箱,那么和pd.cut()相比,pd.qcut()有什么不同呢?
试想一下如果我们有一个很大的数据集,需要对其中一项进行分箱,分箱的依据不是单纯的等宽箱体或者没有确定的分解值,而是按照分位数进行分箱,比如前四分之一的是一个箱体这种要求,用pd.cut()不是不能实现,只是比较麻烦,还要先计算分位数作为分解值。这个时候,pd.qcut()就方便很多了。
先看一下官方文档给出的函数作用:
基于分位数的离散化功能。 将变量离散化为基于等级或样本分位数的相等大小的存储桶。
再来看一下这个函数都包含有哪些参数,主要参数的含义与作用都是什么?
和pd.cut()相比,pd.qcut()的参数少了两个,少了right和include_lowest两个参数,剩下的参数几乎和pd.cut()一模一样了。
pd.qcut(x, q, labels=None, retbins=False, precision=3, duplicates=‘raise’)
x :一维数组或者Serise
q : 表示分位数的整数或者数组,
labels : 数组或者布尔值,默认为none,用于指定每个箱体的标签
rebines :布尔值,可选。 是否显示分箱的分界值。(由于是按照分位数进行分箱,在不知道分位数具体数值的情况下,可以通过这个参数设置显示分界值即分位数的具体数值)
precision:整数,默认3,存储和显示分箱标签的精度。
duplicates:如果分箱临界值不唯一,则引发ValueError或丢弃非唯一
pd.qcut()的参数就是这些了,并不是所有的参数都常用,下边我们通过代码示例来看一下常用参数的应用。
还是用原来的数据集
df_f = pd.read_excel(r"D:\data\football\球队排名比分2019.xlsx") df_f
参数q
参数q控制箱子的个数以及分界值,我们先来探索这个参数:
pd.qcut(df_f.积分,4,labels=["低","中","高","很高"])
q=4表示分成四个箱子,边界值分别为四分位数,四分之二分位数和四分之三分位数,并给每个箱子都指定了标签,看下结果:
0 很高 1 很高 2 很高 3 很高 4 很高 5 高 6 高 7 高 8 高 9 中 10 中 11 中 12 中 13 中 14 中 15 低 16 低 17 低 18 低 19 低 Name: 积分, dtype: category Categories (4, object): [低 < 中 < 高 < 很高]
再通过将q设置成数组看下分类结果是否一致:
pd.qcut(df_f.积分,[0,0.25,0.5,0.75,1],labels=["低","中","高","很高"])
直接设置成四分位数,四分之二分位数和四分之三分位数,看下结果:
0 很高 1 很高 2 很高 3 很高 4 很高 5 高 6 高 7 高 8 高 9 中 10 中 11 中 12 中 13 中 14 中 15 低 16 低 17 低 18 低 19 低 Name: 积分, dtype: category Categories (4, object): [低 < 中 < 高 < 很高]
结果是完全一致的。
温馨提示:不管是pd.cut()还是pd.qcut(),如果直接指定分箱的分界值,即bines和q的取值如果是数字,一定要把每一个箱体的上分界值和下分界值都写上,即每个箱体都是有上下限的,如果分四个箱子参数数组中比如有5个数值才可以。
参数lsbels
探索完q参数我们来看下labels参数,这个参数在介绍pd.cut()时没有具体探讨,其实在两个函数中,labels的作用是一致的,我们在此研究一下,上边例子中labels都指定了标签名字,如果不指定,会有怎样的结果呢?
pd.qcut(df_f.积分,4)
结果如下:
0 (32.5, 61.0] 1 (32.5, 61.0] 2 (32.5, 61.0] 3 (32.5, 61.0] 4 (32.5, 61.0] 5 (28.0, 32.5] 6 (28.0, 32.5] 7 (28.0, 32.5] 8 (28.0, 32.5] 9 (23.5, 28.0] 10 (23.5, 28.0] 11 (23.5, 28.0] 12 (23.5, 28.0] 13 (23.5, 28.0] 14 (23.5, 28.0] 15 (13.999, 23.5] 16 (13.999, 23.5] 17 (13.999, 23.5] 18 (13.999, 23.5] 19 (13.999, 23.5] Name: 积分, dtype: category Categories (4, interval[float64]): [(13.999, 23.5] < (23.5, 28.0] < (28.0, 32.5] < (32.5, 61.0]]
如果不指定labels,也就是说每个箱体都没有名字,那么只好把箱体展现出来,即显示每个箱体的两个临界值,至于要不要设置labels,视情况需求而定哦!
参数rebines
这个参数的作用是显示箱体的分界值:
pd.qcut(df_f.积分,4,labels=["低","中","高","很高"],retbins=True)
查看结果,和上边没有设置这个参数的结果做一下对比就可以发现该参数的作用了:
(0 很高 1 很高 2 很高 3 很高 4 很高 5 高 6 高 7 高 8 高 9 中 10 中 11 中 12 中 13 中 14 中 15 低 16 低 17 低 18 低 19 低 Name: 积分, dtype: category Categories (4, object): [低 < 中 < 高 < 很高], array([14. , 23.5, 28. , 32.5, 61. ]))
最后位置多了一个数组,数组内就是每个箱体的分界值了。
文章开头提到pd.qcut()比pd.cut()少两个参数,少的参数是控制分界值被分到哪个箱子的,按分位数分箱不能控制分界值被分到哪里,显示分界值后能够发现,每个箱体的数值是包含上分界值的。
再看一眼原数据:
其中28是一个第二个箱体的上限,即标签为“中”的箱体,而在分箱的时候,数值为28的球队都被分到了标签为“中”的箱体中,这个小细节可能很容易被忽视掉,这里做一下小提醒。
关于分箱的函数介绍到这里,大家能够区分并根据实际需求灵活运用pd.qcut()和pd.cut()了吗?
小伙伴们还有哪些疑问或者新发现欢迎一起讨论哦!
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数字化市场调研体系中,大数据与小数据是两类核心调研数据形态,分别对应海量行为统计与精准样本深度调研。行业普遍存在认知误 ...
2026-08-07数据透视表是Excel、WPS中最核心的数据分析工具,凭借快速汇总、分组统计、动态筛选的优势,被广泛应用于销量统计、业绩复盘、数 ...
2026-08-07 很多数据分析师每天盯着GMV、DAU、转化率,但当被问到“哪些指标在所有行业都适用”“哪些指标只对电商有意义”“二者如何搭 ...
2026-08-07在商品销量、市场需求、营收规模等业务数据中,季节性波动是最普遍、最核心的数据特征。零售快消、食品餐饮、家电服饰、电商行业 ...
2026-08-06在流量红利消退、市场竞争白热化的商业环境中,传统依托经验、跟风投放、广撒网式的营销模式,逐渐暴露出成本高、精准度低、转化 ...
2026-08-06 很多数据分析师每天盯着GMV、DAU、转化率,但当被问到“什么是指标”“指标和维度有什么区别”“如何定义指标值的计算规则和 ...
2026-08-06【核心关键词】知识、设备、工程师、数字化、建模、算法、工业大数据、数据分析、控制算法、机器学习、深度学习、业务目标、工 ...
2026-08-05增长率是数据分析、业务报表、可视化看板中最核心的指标之一,常用于衡量营收、销量、用户量、流量等业务数据的涨跌幅度与发展趋 ...
2026-08-05小陈是某电商平台的数据分析师。老板交给他一个任务:“我们平台的注册用户已经突破1000万了,想了解一下用户的平均月消费金额。 ...
2026-08-05在机器学习建模、数据预处理、抽样划分、模型初始化训练的全流程中,随机种子是控制实验随机性、保证结果可复现、提升模型稳定性 ...
2026-08-04Python作为面向对象的主流编程语言,核心编程体系由变量、方法、类三大基础要素构成。三者层层递进、相互协作,支撑起所有基础代 ...
2026-08-04 很多数据分析师沉迷于复杂的机器学习算法,却忽略了数据分析最基础也最核心的能力——描述性统计。事实上,80%的商业分析问 ...
2026-08-04为什么学习数据分析? 当下,我们已然步入数据要素价值全面释放的智能时代。数据不再只是零散的数字记录,更是驱动新质生产力运 ...
2026-08-03CDA等级认证证书有效期为三年,三年进行一次年审,主要考察CDA持证人的职业发展情况;学历、工作单位及职业变更情况;继续教育 ...
2026-08-03【核心关键词】金融、岗位、企业、算法、知识、专业、理论、课程、软件、数据分析、业务类型、应用场景、经营管理、大型企业、 ...
2026-08-03在日常数据分析、业务报表复盘、业绩预测工作中,平均增长率是衡量数据长期变化趋势的核心指标,广泛用于营收增长、用户增长、销 ...
2026-08-03很多人把统计学理解为“一堆公式和计算”,却忽略了它的本质——一门让数据“开口说话”的科学。真正的数据分析高手,不是会算平 ...
2026-08-03在数据指标体系搭建工作中,从业者常困惑于指标搭建的核心逻辑:究竟是依托一线零散数据自下而上汇总指标,还是基于战略目标自上 ...
2026-07-31在数据分析、问卷研究、实验复盘、业务建模的工作中,大多数人最关注的是“用什么统计方法”:是做T检验、方差分析、卡方检验, ...
2026-07-31 许多数据分析师精通Excel函数和SQL查询,但当面对一张上万行的销售明细表,要快速回答“哪个地区销量最高”“哪款产品增长最 ...
2026-07-31