浅谈pandas.cut与pandas.qcut的使用方法及区别

1. 前言

Pandas是Python中非常流行的数据分析库,它提供了很多数据处理和数据分析的功能。在数据处理的过程中,经常需要将连续型的数值变量变成离散型的分类型变量。而Pandas中提供了两个非常常用的函数 pandas.cut() 和 pandas.qcut() 来实现这个目的。这两个函数的主要区别在于分箱的方式以及如何确定每个箱子的范围。本文将详细介绍这两个函数的使用方法与区别。

2. pandas.cut()

2.1 函数说明

cut函数主要用于根据值的大小,将连续型变量划分到离散的区间。它的基本使用方法如下:

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

其中各个参数的含义如下:

x: 需要离散化的序列(一维数组、Series或DataFrame的一列)

bins: 分箱(即区间)的个数或分箱的划分(如需要将数据分为 0~20、20~40、40~60、60~80、80~100 则 bins=[0, 20, 40, 60, 80, 100])

right: 是否包含右端点(默认为True,表示包含右端点)

labels: 各区间的标签(可以是列表或数组)

retbins: 是否需要返回每个区间的范围

precision: 区间边界的小数位数

include_lowest: 是否将最低值作为第一个区间的左端点

duplicates: 出现重复区间时的处理方法('raise': 报错;'drop':删除;'raise':不删除)

ordered: 标签是否应该按顺序返回

2.2 示例说明

接下来通过一个示例来说明cut函数的使用方法:

import pandas as pd

import numpy as np

# 生成一组数据

np.random.seed(666)

scores = np.random.randint(0, 100, size=20)

# 将数据划分为 0-60、60-70、70-80、80-90、90-100 五个区间

bins = [0, 60, 70, 80, 90, 100]

pd.cut(scores, bins=bins)

上述代码中,我们先用NumPy生成了20个在0~100之间的整数,然后将它们按照分箱的规则分成了 0~60、60~70、70~80、80~90、90~100 五个区间,最后输出的结果如下:

[(70, 80], (70, 80], (60, 70], (0, 60], (80, 90], ..., (90, 100], (70, 80], (70, 80], (90, 100], (90, 100]]

Categories (5, interval[int64]): [(0, 60] < (60, 70] < (70, 80] < (80, 90] < (90, 100]]

从输出结果可以看出,cut函数将这20个数据分成五个区间,并给每个区间打上了标签,同时返回了一个Categorical对象。Categorical对象中的categories属性保存了所有的标签,即区间的名称;codes属性保存了每个数据所处的区间,即categories中的下标。

3. pandas.qcut()

3.1 函数说明

与cut函数不同,qcut函数主要用于针对分布进行区间划分。它根据样本分布的情况,将数据分为若干等份,以达到各份数据数量相等的目的。qcut函数的基本使用方法如下:

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

其中各个参数的含义如下:

x: 需要离散化的序列(一维数组、Series或DataFrame的一列)

q: 分位数,用来指定数据分为几份。例如 q=4 则将数据分为四份,q=[0, 0.25, 0.5, 0.75, 1] 则将数据分为四份,分界点为样本的四分位数

labels: 各区间的标签(可以是列表或数组)

retbins: 是否需要返回每个区间的范围

precision: 区间边界的小数位数

duplicates: 出现重复区间时的处理方法('raise': 报错;'drop':删除;'raise':不删除)

3.2 示例说明

接下来通过一个示例来说明qcut函数的使用方法:

import pandas as pd

import numpy as np

# 生成一组数据

np.random.seed(666)

scores = np.random.normal(0, 1, size=20)

# 将数据分为 4 份

pd.qcut(scores, q=4)

上述代码中,我们用NumPy生成了20个服从正态分布的随机数,并将它们分成了四个区间,最后输出的结果如下:

[(-1.573, -0.633], (0.658, 2.437], (0.658, 2.437], (-0.0423, 0.658], (0.0412, 0.658], ..., (-1.573, -0.633], (-0.0423, 0.658], (-0.633, -0.0423], (0.658, 2.437], (-0.0423, 0.658]]

Categories (4, interval[float64]): [(-1.573, -0.633] < (-0.633, -0.0423] < (-0.0423, 0.658] < (0.658, 2.437]]

从输出结果可以看出,qcut函数将这20个数据分成了四个区间,并根据数据在样本中的分布情况给每个区间打上了标签,同时返回了一个Categorical对象。

4. pandas.cut()和pandas.qcut()的区别

cut函数和qcut函数都常用于将连续型变量离散化成多个类别。在实际使用中,我们在针对不同的问题时需要结合实际情况来选择使用 cut 函数还是 qcut 函数。

cut函数更多的是针对样本的现实情况进行划分,它更多的依据人们的经验或实际问题,设定出不同的划分点。适用于数据分布稳定,没有极端值的数据。所以,当数据分布严重偏态或存在极端值时,cut函数效果通常不如qcut函数。

而qcut函数则是将数据分为若干等份,从而尽量使每份数据的大小相等,更多考虑数据的分布情况。适用于数据分布不稳定,存在明显偏态或极端值的数据。所以,当我们需要将连续变量划分成多个类别时,如果想要保证每个区间内数据的数量大致相同,可以采用 qcut 函数。

5. 总结

本文主要介绍了Pandas中两个常用的离散化函数 pandas.cut() 和 pandas.qcut() 的使用方法以及区别。cut函数主要是根据分箱的划分将连续型变量变成离散型的分类型变量,而qcut函数则是将数据分为若干等份,尽量使每份数据的大小相等。在实际使用时,我们需要结合实际问题来选择使用哪个函数。

后端开发标签