论cut 和qcut的爱恨情仇

在数据处理的过程中,我们需要将连续型的数据进行离散化,下面我们就探讨一下,将连续性数据离散化的两种方式cut和qcut

1.cut的作用

在关于python的pandas开发的Api文档中,提到’The cut() function computes groupings for the values of the input array and is often used to transform continuous variables to discrete or categorical variables’也就是该cut()函数为输入数组的值计算分组,通常用于将连续变量转换为离散变量或分类变量的意思

2.cut的引用方式

cut方法是基于pandas包下的,所以我们在调用cut方法时候,我们要先将pandas包引入,具体的引用方法是:

import pandas as pd

3.cut的参数

pd.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False)

cut方法一共有这七个参数,主要用于将数据从最大值到最小值进行等距划分:
x:就是输入的数据
bins:cut的段数,一般为整型,但也可以为序列向量(若不在该序列中,则是NaN)
right:布尔值,确定右区间是否开闭,取True时右区间闭合,取False时候右区间开放,默认是为True
labels:数组或布尔值,默认为None,用来标识分后的bins,长度必须与结果bins相等,返回值为整数或者对bins的标识
retbins : 布尔值,可选。是否返回数值所在分组,Ture则返回,False则不返回,默认为False
precision:整型,bins小数精度,也就是数据以几位小数显示,默认为3
include_lowest : 布尔类型,是否包含左区间,默认为False
在这里插入图片描述

4.实际代码演示cut用法

4.1.先构建一个一维数组

ages = np.array([10, 15, 13, 12, 23, 25, 28, 59, 60])
ages

4.2.传入参数bins

pd.cut(ages,bins=3)

我们先看一下,bins=3的输出结果

[(9.95, 26.667], (9.95, 26.667], (9.95, 26.667], (9.95, 26.667], (9.95, 26.667], (9.95, 26.667], (26.667, 43.333], (43.333, 60.0], (43.333, 60.0]]
Categories (3, interval[float64]): [(9.95, 26.667] < (26.667, 43.333] < (43.333, 60.0]]

返回的是每个数对应的分组,每一组的距离也就是(max-min)/bins

4.21当bins为其他类型时候
 c = pd.cut(ages, bins=[0, 18, 35, 70])

再观察一下,输出的结果

[(0, 18], (0, 18], (0, 18], (0, 18], (18, 35], (18, 35], (18, 35], (35, 70], (35, 70]]
Categories (3, interval[int64]): [(0, 18] < (18, 35] < (35, 70]]

返回的是我们指定类型的分组

4.3.传入参数labels

pd.cut(ages, 3,labels=["a","b","c"])
[a, a, a, a, a, a, b, c, c]
Categories (3, object): [a < b < c]

结果返回的分组名称是我们指定的a,b,c

4.31当labels为布尔类型时候
pd.cut(ages, 3,labels=False)
array([0, 0, 0, 0, 0, 0, 1, 2, 2], dtype=int64)

结果仅仅显示了分组下标

4.传入参数retbins
由于retbins默认为False,我们可以观察一下True时候的结果

 pd.cut(ages, 3,retbins=True)
([(9.95, 26.667], (9.95, 26.667], (9.95, 26.667], (9.95, 26.667], (9.95, 26.667], (9.95, 26.667], (26.667, 43.333], (43.333, 60.0], (43.333, 60.0]]
 Categories (3, interval[float64]): [(9.95, 26.667] < (26.667, 43.333] < (43.333, 60.0]],
 array([  9.95      ,  26.66666667,  43.33333333,  60.        ]))

返回每个数对应的分组,且额外返回bins,即每个边界值

5.qcut的作用

按照数据出现频率百分比划分,比如要把数据分为四份,则四段分别是数据的0-25%,25%-50%,50%-75%,75%-100%,每个间隔段里的元素个数都是相同的。

6.qcut的参数

pd.qcut(x, q, labels=None, retbins=False, precision=3, duplicates='raise') 

x:传入的数据
q:将数据分成的组数
labels:数组或布尔值,默认为None,用来标识分后的bins,长度必须与结果bins相等,返回值为整数或者对bins的标识
precision:整型,bins小数精度,也就是数据以几位小数显示,默认为3
duplicates:最后一个参数 duplicates='drop’表示若有重复区间则删除。默认为raise
在这里插入图片描述

7.代码的方式观察qcut的用法

7.1 传入参数x和q
 pd.qcut(ages, 3)
[(9.999, 14.333], (14.333, 26.0], (9.999, 14.333], (9.999, 14.333], (14.333, 26.0], (14.333, 26.0], (26.0, 60.0], (26.0, 60.0], (26.0, 60.0]]
Categories (3, interval[float64]): [(9.999, 14.333] < (14.333, 26.0] < (26.0, 60.0]]

返回每个数对应的分组,我们可以通过value_counts()的形式观察每个组对应的元素个数

(9.999, 14.333]    3
(14.333, 26.0]     3
(26.0, 60.0]       3
dtype: int64
7.2传入lables参数
pd.qcut(ages, 3,labels=["a","b","c"])
[a, b, a, a, b, b, c, c, c]
Categories (3, object): [a < b < c]

返回每个数对应的分组,但分组名称由label指示
7.21当labels参数为布尔类型时候

pd.qcut(ages, 3,labels=False)
array([0, 1, 0, 0, 1, 1, 2, 2, 2], dtype=int64)

结果返回的是元素对应的分组下标
7.3传入retbins参数

pd.qcut(ages, 3,retbins=True)
([(9.999, 14.333], (14.333, 26.0], (9.999, 14.333], (9.999, 14.333], (14.333, 26.0], (14.333, 26.0], (26.0, 60.0], (26.0, 60.0], (26.0, 60.0]]
 Categories (3, interval[float64]): [(9.999, 14.333] < (14.333, 26.0] < (26.0, 60.0]],
 array([ 10.        ,  14.33333333,  26.        ,  60.        ]))

返回每个数对应的分组,且额外返回bins,即每个边界值

8.总结

通过对cut和qcut的作用介绍和对应的参数以及用法,我们可以知道cut和qcut都可以将连续型的数据进行离散化,但是cut的输入的数据只能是array,但是qcut可以输入array和Series,cut是等距离分组,qcut是等比例分组,qcut容易受数据的数量影响

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值