论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容易受数据的数量影响