【Pandas-10】离散化和分箱

   

在机械学习中,我们经常会对数据进行分箱处理的操作, 也就是 把一段连续的值切分成若干段,每一段的值看成一个分类。这个把连续值转换成离散值的过程,我们叫做分箱处理。

比如,把年龄按15岁划分成一组,0-15岁叫做少年,16-30岁叫做青年,31-45岁叫做壮年。在这个过程中,我们把连续的年龄分成了三个类别,"少年","青年"和"壮年"就是各个类别的名称,或者叫做标签。

cut和qcut函数的基本介绍

在pandas中,cut和qcut函数都可以进行分箱处理操作。其中cut函数是按照数据的值进行分割,而qcut函数则是根据数据本身的数量来对数据进行分割。

一、pandas.cut

1 函数介绍

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,布尔值。第一个区间的左端点是否包含

返回值:

若labels为False则返回整数填充的Categorical或数组或Series

若retbins为True还返回用浮点数填充的N维数组

2 实例

import pandas as pd

年份 = [1992, 1983, 1922, 1932, 1973] # 待分箱数据

箱子 = [1900, 1950, 2000] # 指定箱子的分界点

结果 = pd.cut(年份, 箱子)

print(结果)

# 结果说明:其中(1950, 2000]说明【年份】列表的第一个值1992位于(1950, 2000]区间

   

print(pd.value_counts(结果)) # 对不同箱子中的数进行计数

   

# labels参数为False时,返回结果中用不同的整数作为箱子的指示符

结果2 = pd.cut(年份, 箱子,labels=False)

# 输出结果中的数字对应着不同的箱子

print(结果2)

# 结果说明:其中 1 说明【年份】列表的第一个值1992位于(1950, 2000]区间

# 其中 0 说明【年份】列表的第一个值1922位于(1900, 1950]区间

   

print(pd.value_counts(result2)) # 对不同箱子中的数进行计数

   

import pandas as pd

年份 = [1992, 1983, 1922, 1932, 1973] # 待分箱数据

箱子 = [1900, 1950, 2000] # 指定箱子的分界点

# 可以将想要指定给不同箱子的标签传递给labels参数

箱子名称 = [ '50年代前', '50年代后']

结果3 = pd.cut(年份, 箱子, labels=箱子名称)

print(pd.value_counts(结果3))

二、pandas.qcut

1 理论

pandas.qcut 和上面基本相同,只是q分箱需要自己设置。可以指定箱子的数量对连续数据进行等宽分箱处理(注意:所谓等宽指的是每个箱子中的数据量是相同的)

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

2 实例

import pandas as pd

年份 = [1992, 1983, 1922, 1932, 1973, 1999, 1993, 1995] # 待分箱数据

结果 = pd.qcut(年份,q=4) # 参数q指定所分箱子的数量

# 从输出结果可以看到每个箱子中的数据量时相同的

print(结果)

print(pd.value_counts(结果)) # 从输出结果可以看到每个箱子中的数据量时相同的

   

posted @ 2021-04-14 20:46  忆凡人生  阅读(878)  评论(0编辑  收藏  举报