cut qcut

factors = np.random.randn(30)

In [11]:
pd.cut(factors, 5)
Out[11]:
[(-0.411, 0.575], (-0.411, 0.575], (-0.411, 0.575], (-0.411, 0.575], (0.575, 1.561], ..., (-0.411, 0.575], (-1.397, -0.411], (0.575, 1.561], (-2.388, -1.397], (-0.411, 0.575]]
Length: 30
Categories (5, object): [(-2.388, -1.397] < (-1.397, -0.411] < (-0.411, 0.575] < (0.575, 1.561] < (1.561, 2.547]]

In [14]:
pd.qcut(factors, 5)
Out[14]:
[(-0.348, 0.0899], (-0.348, 0.0899], (0.0899, 1.19], (0.0899, 1.19], (0.0899, 1.19], ..., (0.0899, 1.19], (-1.137, -0.348], (1.19, 2.547], [-2.383, -1.137], (-0.348, 0.0899]]
Length: 30
Categories (5, object): [[-2.383, -1.137] < (-1.137, -0.348] < (-0.348, 0.0899] < (0.0899, 1.19] < (1.19, 2.547]]`

cut是等距,qcut是等频

qcut方法,参考链接:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.qcut.html

  1).参数:pandas.qcut(xqlabels=Noneretbins=Falseprecision=3duplicates='raise')

    >>>x 要进行分组的数据,数据类型为一维数组,或Series对象

    >>>q 组数,即要将数据分成几组,后边举例说明

    >>>labels 可以理解为组标签,这里注意标签个数要和组数相等

    >>>retbins 默认为False,当为False时,返回值是Categorical类型(具有value_counts()方法),为True是返回值是元组

 

 

pandas.cut:

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

参数:

  1. x,类array对象,且必须为一维,待切割的原形式
  2. bins, 整数、序列尺度、或间隔索引。如果bins是一个整数,它定义了x宽度范围内的等宽面元数量,但是在这种情况下,x的范围在每个边上被延长1%,以保证包括x的最小值或最大值。如果bin是序列,它定义了允许非均匀bin宽度的bin边缘。在这种情况下没有x的范围的扩展。
  3. right,布尔值。是否是左开右闭区间
  4. labels,用作结果箱的标签。必须与结果箱相同长度。如果FALSE,只返回整数指标面元。
  5. retbins,布尔值。是否返回面元组
  6. precision,整数。返回面元的小数点几位
  7. include_lowest,布尔值。第一个区间的左端点是否包含

返回值:

 

 

    1. ages = [20, 22, 25, 27, 21, 23, 37, 31, 61, 45, 41, 32]
    2.  
       
    3.  
      bins = [18, 25, 35, 60, 100]
    4.  
      cats = pd.cut(ages, bins)
    5.  

若labels为False则返回整数填充的Categorical或数组或Series 
若retbins为True还返回用浮点数填充的N维数组

demo:

>>> pd.cut(np.array([.2, 1.4, 2.5, 6.2, 9.7, 2.1]), 3, retbins=True)
... 
([(0.19, 3.367], (0.19, 3.367], (0.19, 3.367], (3.367, 6.533], ...
Categories (3, interval[float64]): [(0.19, 3.367] < (3.367, 6.533] ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> pd.cut(np.array([.2, 1.4, 2.5, 6.2, 9.7, 2.1]),
...        3, labels=["good", "medium", "bad"])
... 
[good, good, good, medium, bad, good]
Categories (3, object): [good < medium < bad] 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> pd.cut(np.ones(5), 4, labels=False)
array([1, 1, 1, 1, 1])

pandas.qcut

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

参数:

1.x 
2.q,整数或分位数组成的数组。 
3.labels, 
4.retbins 
5.precisoon 
6.duplicates 
结果中超过边界的值将会变成NA

demo:

>>> pd.qcut(range(5), 4)
... 
[(-0.001, 1.0], (-0.001, 1.0], (1.0, 2.0], (2.0, 3.0], (3.0, 4.0]]
Categories (4, interval[float64]): [(-0.001, 1.0] < (1.0, 2.0] ...
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>> pd.qcut(range(5), 3, labels=["good", "medium", "bad"])
... 
[good, good, medium, bad, bad]
Categories (3, object): [good < medium < bad]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pd.qcut(range(5), 4, labels=False)
array([0, 0, 1, 2, 3])
 

转载于:https://www.cnblogs.com/fujian-code/p/9263449.html

<think>首先,用户的问题是关于pandas中cutqcut函数的区别和使用场景。我需要基于提供的引用来回答,但引用是站内引用,不是用户真正的需求,所以我应该专注于用户的问题。 用户的问题是:"我想理解pandas中cutqcut函数的区别与使用场景 请问pandas cutqcut函数的区别及使用方法" 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 - 回答结构清晰,帮助用户逐步解决问题,尽量保证回答真实可靠。 参考引用: - 引用[1]: 展示了cutqcut的代码示例,显示cut基于值的范围分组,而qcut基于分位数分组,导致每个组的大小大致相等。 - 引用[2]: 描述了qcut的参数和用法。 - 引用[3]: 描述了cut的参数和用法。 - 引用[4]: 提供了更多cutqcut的示例,包括自定义标签和使用场景。 关键点: - cut: 基于指定的bins(区间)来分组数据。bins可以是等宽的或自定义的。 - qcut: 基于分位数来分组数据,确保每个组有大致相同数量的元素。 区别: - cut将数据分成等宽的区间,但组内元素数量可能不均。 - qcut将数据分成等频的区间,即每个组有相似数量的元素。 使用场景: - 当需要基于固定范围分组时,如年龄分组、成绩分级,用cut- 当需要基于分布分组,使每个组大小相似时,如分位数分析,用qcut。 回答结构: 1. 介绍cutqcut的基本概念。 2. 详细说明区别。 3. 解释使用方法,包括参数和示例。 4. 讨论使用场景。 5. 生成相关问题。 在回答中,引用段落末尾添加引用标识,如[^1]。 由于是中文回答,所有内容用中文。 生成相关问题:在回答结束后,添加"§§相关问题§§"部分,列出相关问题。 现在,构建回答: - 开头:简要介绍问题。 - 主体: - 解释cut函数:参数、用法、示例。 - 解释qcut函数:参数、用法、示例。 - 比较区别。 - 使用场景。 - 结尾:总结。 - 然后添加相关问题。 确保行内数学表达式用$...$,例如在描述公式时。 在这个上下文中,可能没有太多数学,但如果有,如描述分位数,用LaTeX。 例如,分位数可以表示为$q$。 示例代码:在回答中包含代码块,如用户提供的引用中所示。 系统指令说:"生成相关问题",所以在最后添加。 引用标识:在引用具体内容时添加。 例如:"cut函数基于指定的区间分组数据[^3]。" 现在,草拟回答。</think>### pandas中cutqcut函数的区别与使用方法 在pandas库中,`cut`和`qcut`函数都用于将连续数据离散化(即分组或分箱),但它们在分组逻辑和应用场景上有显著差异。下面我将逐步解释它们的区别、参数、使用方法及典型场景,帮助您全面理解。本文基于pandas官方文档和实际示例[^2][^3]。 --- ### 1. **cut函数:基于固定区间分组** `cut`函数根据用户指定的区间(bins)将数据划分为等宽或不均匀的组。每个组的宽度由bins参数定义,但组内元素数量可能不均等。 **核心参数[^3]**: - `x`: 输入数据,必须为一维数组或Series。 - `bins`: 定义分组区间。可以是: - 整数:表示等宽分组的数量(例如`bins=5`会将数据分成5个等宽区间)。 - 序列:自定义区间边界(例如`bins=[0, 50, 100]`定义区间(0,50]和(50,100])。 - `labels`: 可选,为每个组指定标签(例如`labels=['低', '中', '高']`)。 - `right`: 布尔值,默认为True,表示区间右闭左开(如(0,50]);设为False则左闭右开。 - `precision`: 控制区间边界的精度(小数位数)。 - `include_lowest`: 布尔值,是否包含第一个区间的左端点。 **使用示例[^4]**: 假设有一组成绩数据,需要按固定标准分组(如不及格、及格、良、优秀)。 ```python import numpy as np import pandas as pd # 生成300-100的随机成绩 scores = np.random.uniform(0, 100, size=30).astype('int') # 定义分组区间和标签 grades = [0, 59, 70, 85, 100] group_names = ['不及格', '及格', '良', '优秀'] # 使用cut分组 boxs = pd.cut(scores, bins=grades, labels=group_names) print(boxs.value_counts()) # 输出示例:不及格 16, 及格 1, 良 5, 优秀 8 (组大小不均等) ``` 在这个例子中,`cut`基于固定区间分组,但由于数据分布不均,组内元素数量差异大(如不及格组有16个元素)。 **数学原理**: 如果`bins`是整数$k$,函数会计算等宽区间,宽度为$\frac{\max(x) - \min(x)}{k}$,并扩展1%范围以包含极值[^3]。 --- ### 2. **qcut函数:基于分位数等频分组** `qcut`函数根据分位数将数据划分为大小大致相等的组。每个组包含相似数量的元素,但区间宽度可能不均等。 **核心参数[^2]**: - `x`: 输入数据,为一维数组或Series。 - `q`: 组数或分位数序列(例如`q=4`表示分成4组,每组占25%数据)。 - `labels`: 可选,指定组标签。 - `precision`: 控制分位数边界的精度。 - `duplicates`: 处理重复分位数的策略(如'raise'报错或'drop'忽略)。 **使用示例[^1]**: 使用相同数据,但要求每组元素数量相等。 ```python # 生成数据 _arr = np.random.randint(0, 100, 20) _arr_sorted = np.sort(_arr) # 排序便于观察 # 使用qcut分成5组 qcut_factor = pd.qcut(_arr, q=5) print(qcut_factor.value_counts()) # 输出示例:每个组都有4个元素 (组大小相等) ``` 在引用[1]的代码中,`qcut`确保每组元素数量相同(如5组每组4个),而`cut`基于值范围分组导致组大小不一。 **数学原理**: `qcut`计算分位数点,例如$q$组时,分界点为$\frac{i}{q}$分位数($i=1,2,\dots,q-1$),确保每个区间包含$\frac{100}{q}\%$的数据[^2]。 --- ### 3. **cutqcut的关键区别** | 特性 | cut函数 | qcut函数 | |--------------|--------------------------------------|--------------------------------------| | **分组逻辑** | 基于值范围(等宽区间) | 基于分位数(等频分组) | | **组大小** | 可能不均等(取决于数据分布) | 大致相等(强制每个组元素数相似) | | **区间宽度** | 均匀(当bins为整数时) | 可能不均匀(适应数据分布) | | **适用场景** | 固定标准分组(如年龄、成绩分级) | 分布分析(如收入分位、异常值检测) | | **数学基础** | 区间边界由$\Delta x = \frac{\max - \min}{k}$定义 | 边界由分位数$Q_p$计算,其中$p = \frac{i}{q}$ | **简单对比示例**: - 在引用[1]中,`cut`分组结果:各组大小分别为3,2,4,5,6(不均)。 - `qcut`分组结果:每组大小均为4(相等)。 这体现了本质差异:`cut`关注值范围,`qcut`关注数据排名。 --- ### 4. **使用场景建议** - **使用cut当**: 需要基于固定阈值分组。例如: - 成绩分级(0-59不及格, 60-70及格等)[^4]。 - 年龄分组(0-18少年, 19-35青年等)。 优点:直观易解释;缺点:组大小可能失衡,不适用于偏斜数据。 - **使用qcut当**: 需要确保每组代表性均匀。例如: - 收入分位分析(将人群分为低收入、中收入、高收入组,每组占20%)。 - 机器学习中的分桶特征工程(如处理连续变量)。 优点:处理偏斜分布效果好;缺点:区间宽度不固定,解释性稍弱。 **高级技巧**: - 结合`labels`参数:为组添加语义标签,提升可读性。 - 处理边界:用`right=False`调整开闭区间,避免边界歧义。 - 精度控制:`precision=2`减少小数位数,简化输出[^3]。 --- ### 总结 `cut`和`qcut`都是强大的离散化工具,但核心区别在于分组逻辑:`cut`基于值范围(等宽),适合固定标准场景;`qcut`基于分位数(等频),适合分布分析。在实际应用中,选择取决于需求——如果强调组间范围一致性,用`cut`;如果强调组内元素均匀性,用`qcut`。通过参数调整(如`labels`或`precision`),可以优化输出可读性[^1][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值