关于人工智能:Pandas-对数值进行分箱操作的4种方法总结对比

30次阅读

共计 2394 个字符,预计需要花费 6 分钟才能阅读完成。

分箱是一种常见的数据预处理技术有时也被称为分桶或离散化,他可用于将间断数据的距离分组到“箱”或“桶”中。在本文中,咱们将探讨应用 python Pandas 库对数值进行分箱的 4 种办法。

咱们创立以下合成数据用于演示

import pandas as pd # version 1.3.5
import numpy as np
def create_df():
df = pd.DataFrame({'score': np.random.randint(0,101,1000)})
return df

create_df()
df.head()

数据包含 1000 名学生的 0 到 100 分的考试分数。而这次的工作是将数字分数分为值“A”、“B”和“C”的等级,其中“A”是最好的,“C”是最差的。

1、between & loc

Pandas .between 办法返回一个蕴含 True 的布尔向量,用来对应的 Series 元素位于边界值 left 和 right[1] 之间。

参数有上面三个:

  • left:左边界
  • right:右边界
  • inclusive:要包含哪个边界。可承受的值为 {“both”、“neither”、“left”、“right”}。

依据以下距离规定将学生的分数分为等级:

  • A: (80, 100]
  • B: (50, 80]
  • C: [0, 50]

其中方括号 [和圆括号) 别离示意边界值是蕴含的和不蕴含的。咱们须要确定哪个分数在感兴趣的区间之间,并为其调配相应的等级值。留神看上面的不同的参数示意是否蕴含边界

df.loc[df['score'].between(0, 50, 'both'), 'grade'] = 'C'
df.loc[df['score'].between(50, 80, 'right'), 'grade'] = 'B'
df.loc[df['score'].between(80, 100, 'right'), 'grade'] = 'A'

以下是每个分数区间的人数:

df.grade.value_counts()

此办法须要为每个 bin 编写解决的代码,因而它仅实用于 bin 很少的状况。

2、cut

能够应用 cut 将值分类为离散的距离。此函数对于从连续变量到分类变量 [2] 也很有用。

cut 的参数如下:

  • x:要分箱的数组。必须是一维的。
  • bins:标量序列:定义容许非平均宽度的 bin 边缘。
  • labels:指定返回的 bin 的标签。必须与下面的 bins 参数长度雷同。
  • include_lowest: (bool) 第一个区间是否应该是左蕴含的。
bins = [0, 50, 80, 100]
labels = ['C', 'B', 'A']
df['grade'] = pd.cut(x = df['score'], bins = bins, labels = labels, include_lowest = True)

这样就创立一个蕴含 bin 边界值的 bins 列表和一个蕴含相应 bin 标签的标签列表。

查看每个区段的人数

df.grade.value_counts()

后果与下面示例雷同。

3、qcut

qcut 能够依据排名或基于样本分位数将变量离散为大小相等的桶 [3]。

在后面的示例中,咱们为每个级别定义了分数距离,这回使每个级别的学生数量不平均。在上面的示例中,咱们将尝试将学生分类为 3 个具备相等(大概)数量的分数等级。示例中有 1000 名学生,因而每个分箱应该有大概 333 名学生。

qcut 参数:

x:要分箱的输出数组。必须是一维的。

q:分位数。10 示意非常位数,4 示意四分位数等。也能够是交替排列的分位数,例如 [0, .25, .5, .75, 1.] 四分位数。

labels:指定 bin 的标签。必须与生成的 bin 长度雷同。

retbins: (bool) 是否返回 (bins, labels)。

df['grade'], cut_bin = pd.qcut(df['score'], q = 3, labels = ['C', 'B', 'A'], retbins = True)
df.head()

如果 retbins 设置为 True 则会返回 bin 边界。

print (cut_bin)
>> [0.  36.  68. 100.]

分数距离如下:

  • C:[0, 36]
  • B:(36, 68]
  • A:(68, 100]

应用 .value_counts() 查看每个等级有多少学生。现实状况下,每个箱应该有大概 333 名学生。

df.grade.value_counts()

4、value_counts

尽管 pandas .value_counts 通常用于计算系列中惟一值的数量,但它也可用于应用 bins 参数 [4] 将值分组到半开箱中。

df['score'].value_counts(bins = 3, sort = False)

默认状况下,.value_counts 按值的降序对返回的系列进行排序。将 sort 设置为 False 以按其索引的升序对系列进行排序。

series 索引是指每个 bin 的区间范畴,其中方括号 [和圆括号) 别离示意边界值是蕴含的和不蕴含的。返回 series 的值示意每个 bin 中有多少条记录。

与 .qcut 不同,每个 bin 中的记录数不肯定雷同(大概)。.value_counts 不会将雷同数量的记录调配到雷同的类别中,而是依据最高和最低分数将分数范畴分成 3 个相等的局部。分数的最小值为 0,最大值为 100,因而这 3 个局部中的每一个都大概在 33.33 范畴内。这也解释了为什么 bin 的边界是 33.33 的倍数。

咱们还能够通过传入边界列表来定义 bin 边界。

df['score'].value_counts(bins = [0,50,80,100], sort = False)

这给了咱们与示例 1 和 2 雷同的后果。

总结

在本文中,介绍了如何应用 .between、.cut、.qcut 和 .value_counts 对间断值进行分箱。这里是本文的源代码:

https://avoid.overfit.cn/post/dc11c84491e841dea928d652f0f93005

作者:Edwin Tan

正文完
 0