Python中pd.cut()与pd.qcut()的区别与使用详解
本文详细解析Python pandas库中pd.cut()与pd.qcut()两个数据离散化函数的区别。pd.cut()基于固定区间或数量进行等距划分,而pd.qcut()基于分位数确保各区间样本数量一致。文章通过具体代码示例对比了参数如bins、q、right、include_lowest及duplicates的使用场景,帮助开发者根据数据分布特征选择合适的离散化方法。
1、pd.cut()
该函数主要用于将连续数据值按照指定的区间边界进行分段,并将数据归类到相应的bins(箱)中。其核心参数包括:x(输入数据)、bins(区间定义)、right(右端点包含性)、include_lowest(左端点包含性)、labels(标签替换)、retbins(是否返回区间边界)以及precision(精度控制)。
参数x代表需要被划分的数组或序列;bins参数则定义了划分的区间范围或区间的数量。
- - ① 当bins参数设置为整数时,表示将数组x均匀划分为该整数指定的等间距区间数量;
- - ② 当bins参数设置为序列(如列表或数组)时,表示使用序列中指定的具体边界值进行划分。若数据值不在任何指定区间内,则对应位置输出NaN;
# x = [1,2,3,5,3,4,1], bins = 3
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),3)
[Out] [(0.996, 2.333], (0.996, 2.333], (2.333, 3.667], (3.667, 5.0], (2.333, 3.667], (3.667, 5.0], (0.996, 2.333]]
Categories (3, interval[float64]): [(0.996, 2.333] < (2.333, 3.667] < (3.667, 5.0]]
# x = [1,2,3,5,3,4,1], bins = [1,2,3]
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),[1,2,3])
[Out] [NaN, (1.0, 2.0], (2.0, 3.0], NaN, (2.0, 3.0], NaN, NaN]
Categories (2, interval[int64]): [(1, 2] < (2, 3]]right参数用于控制区间是否包含右端点,默认值为True(即右闭左开); include_lowest参数用于控制是否包含左端点,默认值为False。
# x = [1,2,3,5,3,4,1], bins = [1,2,3], 默认不包含左端点 1,默认包含右端点 3
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),[1,2,3])
[Out] [NaN, (1.0, 2.0], (2.0, 3.0], NaN, (2.0, 3.0], NaN, NaN]
Categories (2, interval[int64]): [(1, 2] < (2, 3]]
# x = [1,2,3,5,3,4,1], bins = [1,2,3], 设置包含左端点 1,设置包含右端点 3
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),[1,2,3],include_lowest=True,right=False)
[Out] [[1.0, 2.0), [2.0, 3.0), NaN, NaN, NaN, NaN, [1.0, 2.0)]
Categories (2, interval[int64]): [[1, 2) < [2, 3)]labels参数用于指定是否使用自定义标签替代返回的区间对象,默认值为False。若需启用标签,提供的标签数量必须与bins的数量严格一致,且需赋值一组列表;
# x = [1,2,3,5,3,4,1], bins = 3, 设置用指定标签 ['A','B','C'] 返回序列
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),3,labels=['A','B','C'])
[Out] [A, A, B, C, B, C, A]
Categories (3, object): [A < B < C]retbins参数用于控制是否同时返回区间边界序列,默认值为False(仅返回每个值对应的bin列表)。若设置retbins = True,则函数将返回两个对象:一个是每个值对应的bin列表,另一个是对应的bins区间边界数组。
# x = [1,2,3,5,3,4,1], bins = 3, 设置一并返回对应 bins 序列
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),3,retbins=True)
[Out] ([(0.996, 2.333], (0.996, 2.333], (2.333, 3.667], (3.667, 5.0], (2.333, 3.667], (3.667, 5.0], (0.996, 2.333]]
Categories (3, interval[float64]): [(0.996, 2.333] < (2.333, 3.667] < (3.667, 5.0]],
array([0.996 , 2.33333333, 3.66666667, 5. ]))precision参数用于控制区间边界值保留的小数点位数,影响输出结果的精度显示。
# x = [1,2,3,5,3,4,1], bins = 3, 精度为2
[In ] pd.cut(np.array([1,2,3,5,3,4,1]),3,precision=2)
[Out] [(1.0, 2.33], (1.0, 2.33], (2.33, 3.67], (3.67, 5.0], (2.33, 3.67], (3.67, 5.0], (1.0, 2.33]]
Categories (3, interval[float64]): [(1.0, 2.33] < (2.33, 3.67] < (3.67, 5.0]]
2、pd.qcut()
这是一个基于分位数的离散化功能。它根据等级或样本分位数(即基于样本值落在区间的频率),将变量分离为大小相等的桶(buckets)。
其参数包含:x(输入数据)、q(分位数数量)、labels(标签)、retbins(返回边界)、precision(精度)以及duplicates(重复值处理)。
- 其中x、labels、retbins、precision这几个参数的用法与pd.cut()中完全一致;
- q参数用于指定将序列x划分为q个区间,目标是使落在每个区间的值的数量尽可能一致;
- duplicates参数用于处理重复值导致的分位数计算问题,默认值为duplicates = ‘raise’,表示遇到重复值导致区间无法均匀划分时抛出异常。如需忽略x中的重复值影响,可指定duplicates = ‘drop’。
3、pd.cut() v.s. pd.qcut()
- pd.cut()将指定序列x,按指定数量进行等间距划分(根据值本身而不是这些值的频率选择均匀分布的bins),或者按照用户指定的具体间距进行划分;
- pd.qcut()将指定序列x,划分为q个区间,其核心目标是使落在每个区间的记录数保持一致(即频数均衡);
[In] ll = [1,2,3,5,3,4,1,2]
print('- - - pd.cut()示例1 - - -')
print(pd.cut(ll, 4, precision=2).value_counts())
print('- - - pd.cut()示例2 - - -')
print(pd.cut(ll, [1,2,4], precision=2).value_counts())
print('- - - pd.qcut()示例 - - -')
print(pd.qcut(ll, 4, precision=2).value_counts())
[Out] - - - pd.cut()示例1 - - -
(1.0, 2.0] 4
(2.0, 3.0] 2
(3.0, 4.0] 1
(4.0, 5.0] 1
dtype: int64
- - - pd.cut()示例2 - - -
(1, 2] 2
(2, 4] 3
dtype: int64
- - - pd.qcut()示例 - - -
(0.99, 1.75] 2
(1.75, 2.5] 2
(2.5, 3.25] 2
(3.25, 5.0] 2
dtype: int64到此这篇关于python中pd.cut()与pd.qcut()的对比及示例的文章就介绍到这了,更多相关python pd.cut()与pd.qcut()内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









