python 的cut与qcut

我想要实现多分类,样本不是均匀分布的

使用cut,可以实现自定义范围分类
使用qcut,可以实现每个 分类的个数大致相等

cut 与 qcut方法使用

参考 https://www.cnblogs.com/Motimer/p/16006313.html

1、cut方法

pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates='raise', ordered=True)

(1)参数

  • X:被切分的类数组(array-like)数据,必须是1维的。不能是DataFrame。

  • bins:被切割后的区间,有3中形式:int, sequence of scalars, or IntervalIndex。

int:代表将X平分成bins份,x的范围在每侧扩展0.1%,以包括X的最大值和最小值。

sequence of scalars(标量序列):被分割后每一个bin的区间边缘,此时x没有扩展。

IntervalIndex:定义要使用的精确区间。

  • right:bool型,默认为True。是否包括最右边的边缘,比如right=True,bins=[1,2,3,4],则区间为(1,2]、(2,3]、(3,4];right=False,则区间为(1,2)、(2,3)、(3,4)。

  • labels:给分割后的bins打标签。必须与箱子长度相同,比如bins=[1,2,3],划分后有两个区间(1,2]、(2,3],则labels长度必须为2。如果labels=False,则返回X中的数据在第几个 bin中(从0开始)。

  • retbins:bool型,默认为False。是否将分割后的bins返回,当bins为一个int型的标量比较有用,这样可以得到划分后的区间。

  • precision:保留区间小数点的位数,默认为3.

  • include_lowest:bool型,默认为False。第一个间隔是否应包含在内。

  • duplicates:是否允许重复区间。raise:不允许,drop:允许。

  • ordered:bool型,默认为True。True对结果进行排序,False不排序。

(2)返回值

  • out:Categorical, Series, or
    ndarray。分区后x中的每个值在那个bin中,如果指定了labels则返回对应的label。

  • bins:分割后的区间,当指定retbins为True时返回。

(3)举例
  先生成一些测试数据

df = pd.DataFrame([x**2 for x in range(11)],columns=['number',]) # 指数列, 10个数
df

在这里插入图片描述

  1. 按照数据值由小到大的顺序将数据分成4份,并且使每组值的范围大致相等。
df['cut_group'] = pd.cut(df['number'],4)
df

在这里插入图片描述

2.(bins参数:按照指定的边界值对变量进行分割)

df['cut_group'] = pd.cut(df['number'],bins=[0,4,8,12,16,20])
df

在这里插入图片描述

  1. #(labels为False,返回值在第几个bin中)
df['cut_group'] = pd.cut(df['number'],bins=[0,4,8,12,16,20],right=False,labels=False)
df

在这里插入图片描述
4. (返回自定义标签名)

df['cut_group'] = pd.cut(df['number'],bins=[0,4,8,12,16,20],right=False,labels=['第一','第二','第三','第四','第五',])
df

在这里插入图片描述
5 返回划分区间(retbins参数:获取边界值的列表)

df['cut_group'],bins = pd.cut(df['number'],4,retbins=True)
bins

在这里插入图片描述
6

df['cut_group'] = pd.cut(df['number'],bins=[0,4,8,12,16,20],right=True,include_lowest=True) #(第二)
df

在这里插入图片描述

2、qcut方法

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

(1)参数

  • x:一维 ndarray 或系列
  • q:整数或浮点数的list-like,分位数。 10 表示十分位数,4 表示四分位数等。交替排列的分位数,例如[0, .25, .5, .75, 1.] 四分位数。
  • labels:数组或假,默认无。用作结果箱的标签。必须与生成的 bin 长度相同。如果为 False,则仅返回 bin 的整数指示符。如果为 True,则引发错误。
  • retbins:布尔型,可选。是否返回(箱,标签)。如果 bins 作为标量给出,则可能很有用。
  • precision:整数,可选。存储和显示 bin 标签的精度。
  • duplicates:{默认 ‘raise’, ‘drop’},可选。

(2) 举例

  1. 按变量的数量来对变量进行分割,把变量由小到大分成四组,并且让每组变量的数量相同
df = pd.DataFrame([x**2 for x in range(11)],columns=['number',])
df['cut_group'] = pd.qcut(df['number'],4)
df

在这里插入图片描述

  1. 跟cut()一样, 我们可以通过在qcut()设置retbins参数, 获取每个分组的边界值列表。
df['cut_group'], bins = pd.qcut(df['number'],4,retbins=True)
bins

在这里插入图片描述

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pandas分箱是将一系列连续的数值数据划分为离散的“箱子”或“区间”的过程。这种离散化的过程可以用于数据的可视化、数据分析、数据挖掘等应用场景。 Pandas提供了两种分箱方法,分别是cut()和qcut(): 1. cut()方法:可以指定分箱的边界值,也可以指定分箱的数量。 2. qcut()方法:指定分箱的数量,每个分箱中包含的数据数量尽量相等。 下面是一个使用cut()方法进行分箱的示例代码: ```python import pandas as pd import numpy as np # 生成一组随机数据 data = pd.DataFrame(np.random.randn(1000), columns=['value']) # 将数据分成5个等宽的区间 data['value_cut'] = pd.cut(data['value'], 5) # 输出每个区间的数量 print(data['value_cut'].value_counts()) ``` 输出结果如下: ``` (-2.141, -1.125] 169 (-1.125, -0.111] 398 (-0.111, 0.902] 316 (0.902, 1.916] 103 (1.916, 2.93] 14 Name: value_cut, dtype: int64 ``` 上述代码中,我们将data中的value列分成了5个等宽的区间,并将分箱后的结果存放在value_cut列中。最后使用value_cut列的value_counts()方法统计每个区间的数量。 下面是一个使用qcut()方法进行分箱的示例代码: ```python import pandas as pd import numpy as np # 生成一组随机数据 data = pd.DataFrame(np.random.randn(1000), columns=['value']) # 将数据分成5个等频的区间 data['value_qcut'] = pd.qcut(data['value'], 5) # 输出每个区间的数量 print(data['value_qcut'].value_counts()) ``` 输出结果如下: ``` (-3.032, -0.686] 200 (-0.686, -0.175] 200 (-0.175, 0.43] 200 (0.43, 0.988] 200 (0.988, 3.141] 200 Name: value_qcut, dtype: int64 ``` 上述代码中,我们将data中的value列分成了5个等频的区间,并将分箱后的结果存放在value_qcut列中。最后使用value_qcut列的value_counts()方法统计每个区间的数量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值