Pandas的qcut()与cut()

>>> factors = np.random.randn(9)
[ 2.12046097  0.24486218  1.64494175 -0.27307614 -2.11238291 2.15422205 -0.46832859  0.16444572  1.52536248]

pd.qcut()

qcut是根据这些值的频率来选择箱子的均匀间隔,即每个箱子中含有的数的数量是相同的

传入q参数

>>> pd.qcut(factors, 3) #返回每个数对应的分组
[(1.525, 2.154], (-0.158, 1.525], (1.525, 2.154], (-2.113, -0.158], (-2.113, -0.158], (1.525, 2.154], (-2.113, -0.158], (-0.158, 1.525], (-0.158, 1.525]]
Categories (3, interval[float64]): [(-2.113, -0.158] < (-0.158, 1.525] < (1.525, 2.154]]

>>> pd.qcut(factors, 3).value_counts() #计算每个分组中含有的数的数量
(-2.113, -0.158]    3
(-0.158, 1.525]     3
(1.525, 2.154]      3

传入lable参数

>>> pd.qcut(factors, 3,labels=["a","b","c"]) #返回每个数对应的分组,但分组名称由label指示
[c, b, c, a, a, c, a, b, b]
Categories (3, object): [a < b < c]

>>> pd.qcut(factors, 3,labels=False) #返回每个数对应的分组,但仅显示分组下标
[2 1 2 0 0 2 0 1 1]

传入retbins参数

>>> pd.qcut(factors, 3,retbins=True)# 返回每个数对应的分组,且额外返回bins,即每个边界值
[(1.525, 2.154], (-0.158, 1.525], (1.525, 2.154], (-2.113, -0.158], (-2.113, -0.158], (1.525, 2.154], (-2.113, -0.158], (-0.158, 1.525], (-0.158, 1.525]]
Categories (3, interval[float64]): [(-2.113, -0.158] < (-0.158, 1.525] < (1.525, 2.154],array([-2.113,  -0.158 ,  1.525,  2.154]))
参数说明
xndarray或Series
qinteger,指示划分的组数
labelsarray或bool,默认为None。当传入数组时,分组的名称由label指示;当传入Flase时,仅显示分组下标
retbinsbool,是否返回bins,默认为False。当传入True时,额外返回bins,即每个边界值。
precisionint,精度,默认为3

pd.cut()

cut将根据值本身来选择箱子均匀间隔,即每个箱子的间距都是相同的

传入bins参数

>>> pd.cut(factors, 3) #返回每个数对应的分组
[(0.732, 2.154], (-0.69, 0.732], (0.732, 2.154], (-0.69, 0.732], (-2.117, -0.69], (0.732, 2.154], (-0.69, 0.732], (-0.69, 0.732], (0.732, 2.154]]
Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]]

>>> pd.cut(factors, bins=[-3,-2,-1,0,1,2,3])
[(2, 3], (0, 1], (1, 2], (-1, 0], (-3, -2], (2, 3], (-1, 0], (0, 1], (1, 2]]
Categories (6, interval[int64]): [(-3, -2] < (-2, -1] < (-1, 0] < (0, 1] (1, 2] < (2, 3]]

>>> pd.cut(factors, 3).value_counts() #计算每个分组中含有的数的数量
Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]]
(-2.117, -0.69]    1
(-0.69, 0.732]     4
(0.732, 2.154]     4

传入lable参数

>>> pd.cut(factors, 3,labels=["a","b","c"]) #返回每个数对应的分组,但分组名称由label指示
[c, b, c, b, a, c, b, b, c]
Categories (3, object): [a < b < c]

>>> pd.cut(factors, 3,labels=False) #返回每个数对应的分组,但仅显示分组下标
[2 1 2 1 0 2 1 1 2]

传入retbins参数

>>> pd.cut(factors, 3,retbins=True)# 返回每个数对应的分组,且额外返回bins,即每个边界值
([(0.732, 2.154], (-0.69, 0.732], (0.732, 2.154], (-0.69, 0.732], (-2.117, -0.69], (0.732, 2.154], (-0.69, 0.732], (-0.69, 0.732], (0.732, 2.154]]
Categories (3, interval[float64]): [(-2.117, -0.69] < (-0.69, 0.732] < (0.732, 2.154]], array([-2.11664951, -0.69018126,  0.7320204 ,  2.15422205]))
参数说明
xarray,仅能使用一维数组
binsinteger或sequence of scalars,指示划分的组数或指定组距
labelsarray或bool,默认为None。当传入数组时,分组的名称由label指示;当传入Flase时,仅显示分组下标
retbinsbool,是否返回bins,默认为False。当传入True时,额外返回bins,即每个边界值。
precisionint,精度,默认为3

 

转载地址:https://blog.youkuaiyun.com/starter_____/article/details/79327997#t1

<think>我们被要求解释pandasqcutcut函数的区别及使用方法。根据提供的引用材料,我们可以总结如下: 1. **pandas.cut函数**: - 用于将数据分成指定的区间(bins)。 - 可以指定分箱的边界(bins参数),也可以指定一个整数表示分成几个等宽的区间。 - 等宽分箱时,每个箱子的宽度相同,但每个箱子中的样本数量不一定相同。 - 参数说明: - `x`: 要分箱的一维数组。 - `bins`: 整数(等宽分箱的个数)或序列(指定分箱边界)。 - `right`: 是否包含右端点,默认为True(左开右闭)。 - `labels`: 为分箱后的每个区间指定标签。 - 其他参数如`retbins`(是否返回分箱边界)、`precision`(精度)、`include_lowest`(是否包含左端点)等。 示例(引用[4]): ```python import pandas as pd import numpy as np scores = np.random.uniform(0,100,size=30).astype('int') grades = [0,59,70,85,100] boxs = pd.cut(scores, grades, labels=['不及格','及格','良','优秀']) print(boxs.value_counts()) ``` 2. **pandas.qcut函数**: - 用于将数据分成指定数量的分位数区间(等频分箱)。 - 每个箱子中的样本数量尽量相同(或尽可能接近)。 - 参数说明: - `x`: 要分箱的一维数组。 - `q`: 整数(分成几个等频区间)或分位数序列(如[0, 0.25, 0.5, 0.75, 1])。 - 其他参数如`labels`等cut类似。 示例(引用[2]): ```python import pandas as pd import numpy as np _arr = np.random.randint(0,100,20) qcut_factor = pd.qcut(_arr, 5) print(qcut_factor.value_counts()) ``` **主要区别**: - `cut`按变量的取值范围进行等宽分箱,每个箱子的宽度相同,但样本数不一定相同。 - `qcut`按变量的样本分位数进行分箱,每个箱子中的样本数量尽量相同,但箱子的宽度不一定相同。 **使用场景**: - 当我们需要将数据按照数值大小均匀划分到几个区间时,使用`cut`(比如将年龄分成0-10,10-20,20-30等)。 - 当我们需要将数据按样本的分布频率均匀划分(即每个区间包含相同数量的样本)时,使用`qcut`(比如将成绩分成4个等级,每个等级人数相同)。 下面我们通过一个例子更直观地展示: ```python import pandas as pd import numpy as np # 生成20个0到100的随机整数 data = np.random.randint(0, 100, 20) print("原始数据:", data) # 使用cut分成4个等宽区间 cut_result = pd.cut(data, 4) print("cut结果的分箱统计:") print(cut_result.value_counts()) # 使用qcut分成4个等频区间 qcut_result = pd.qcut(data, 4) print("qcut结果的分箱统计:") print(qcut_result.value_counts()) ``` 输出可能类似于: ``` 原始数据: [67 20 52 86 47 14 98 85 99 11 58 24 62 97 55 48 80 19 41 92] cut结果的分箱统计: (10.947, 32.5] 5 (32.5, 54] 5 (54, 75.5] 4 (75.5, 98] 6 dtype: int64 qcut结果的分箱统计: (10.999, 25.5] 5 (25.5, 49.5] 5 (49.5, 80.5] 5 (80.5, 99] 5 dtype: int64 ``` 注意:由于数据是随机的,每次运行结果可能不同,但可以看到cut的每个分箱宽度相同(等宽),而qcut的每个分箱样本数相同(等频)。 **注意事项**: - 使用`cut`时,如果数据分布不均匀,可能会导致某些区间样本数很少,而另一些区间样本数很多。 - 使用`qcut`时,如果数据有重复值,可能无法严格保证每个分箱样本数完全相同,但会尽量均匀。 根据引用[3]和[4],我们还可以使用`labels`参数为分箱后的区间指定标签,使用`retbins`参数获取分箱的边界值。 希望以上解释能帮助您理解qcutcut的区别及使用方法。 §§相关问题§§ 1. 在什么情况下应该使用cut而不是qcut? 2. 如何在使用cutqcut时处理边界值? 3. pandascut函数中,right参数和include_lowest参数分别有什么作用?</think>### pandasqcutcut函数的区别及使用方法 #### 核心区别 | 特性 | `cut`函数 | `qcut`函数 | |--------------|------------------------------|-------------------------------| | **分箱原理** | 按**值域范围**等宽分箱 | 按**样本分位数**等频分箱 | | **箱体特征** | 宽度相等,样本数不等 | 样本数相等,宽度不等 | | **参数核心** | `bins`定义具体边界或箱数 | `q`定义分位数或箱数 | | **适用场景** | 固定阈值划分(如成绩等级) | 数据分布划分(如收入分层) | #### 具体使用方法 **1. `cut`函数(等宽分箱)** ```python import pandas as pd import numpy as np # 自定义边界分箱 data = np.random.randint(0,100,30) bins = [0, 60, 80, 100] # 定义边界 labels = ['不及格', '及格', '优秀'] result = pd.cut(data, bins=bins, labels=labels) print(result.value_counts()) # 等宽分箱(4个箱) result = pd.cut(data, bins=4, precision=0) # precision控制小数位数 ``` **2. `qcut`函数(等频分箱)** ```python # 等频分箱(5个箱,每箱样本数相同) result = pd.qcut(data, q=5) print(result.value_counts()) # 每箱样本数≈6 # 按分位数分箱 result = pd.qcut(data, q=[0, 0.3, 0.7, 1]) # 30%-70%分位数 ``` #### 关键参数解析 ```python pd.cut(x, bins, right=True, labels=None, retbins=False) pd.qcut(x, q, labels=None, retbins=False) ``` - `right`:是否包含右边界(默认True,左开右闭) - `labels`:自定义分箱标签(如['低','中','高']) - `retbins`:返回分箱边界(用于后续分析) - `precision`:分箱边界小数精度(仅cut) #### 使用场景对比 1. **成绩分级(cut)** 需固定阈值:0-59不及格,60-79及格,80-100优秀 ```python pd.cut(scores, bins=[0,59,79,100], labels=['不及格','及格','优秀']) ``` 2. **收入分层(qcut)** 需按人群比例划分:前20%高收入,中间60%中等,后20%低收入 ```python pd.qcut(income, q=[0, 0.2, 0.8, 1], labels=['低','中','高']) ``` #### 注意事项 1. 重复值处理:`duplicates='raise'`(默认)会拒绝重复边界 2. 边界扩展:`cut`的整数分箱会自动扩展1%范围包含极值 3. 标签匹配:`labels`长度必须比分箱数少1(N个边界产生N-1个箱) > 示例结果(引用[2]): > cut分箱:`(8.913,26.4]`区间有3个样本,箱宽17.487 > qcut分箱:`(8.999,31.6]`区间有4个样本,箱宽22.601 > 验证了cut等宽不等频,qcut等频不等宽的特性[^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值