Pandas数值分箱是什么,进行进行分箱的方法有哪些
Admin 2022-08-18 群英技术资讯 726 次浏览
分箱是一种常见的数据预处理技术有时也被称为分桶或离散化,他可用于将连续数据的间隔分组到“箱”或“桶”中。在本文中,我们将讨论使用 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”是最差的等级。
Pandas .between 方法返回一个包含 True 的布尔向量,用来对应的 Series 元素位于边界值 left 和 right 之间。
参数有下面三个:
根据以下间隔规则将学生的分数分为等级:
其中方括号 [ 和圆括号 ) 分别表示边界值是包含的和不包含的。我们需要确定哪个分数在感兴趣的区间之间,并为其分配相应的等级值。注意看下面的不同的参数表示是否包含边界
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()
C 488
B 310
A 202
Name: grade, dtype: int64
此方法需要为每个 bin 编写处理的代码,因此它仅适用于 bin 很少的情况。
可以使用 cut将值分类为离散的间隔。此函数对于从连续变量到分类变量也很有用。
cut的参数如下:
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()
C 488
B 310
A 202
Name: grade, dtype: int64
结果与上面示例相同。
qcut可以根据排名或基于样本分位数将变量离散为大小相等的桶[3]。
在前面的示例中,我们为每个级别定义了分数间隔,这回使每个级别的学生数量不均匀。在下面的示例中,我们将尝试将学生分类为 3 个具有相等(大约)数量的分数等级。示例中有 1000 名学生,因此每个分箱应该有大约 333 名学生。
qcut参数:
df['grade'], cut_bin = pd.qcut(df['score'], q = 3, labels = ['C', 'B', 'A'], retbins = True) df.head()
print (cut_bin) >> [ 0. 36. 68. 100.]
分数间隔如下:
使用 .value_counts() 检查每个等级有多少学生。理想情况下,每个箱应该有大约 333 名学生。
df.grade.value_counts()
C 340
A 331
B 329
Name: grade, dtype: int64
虽然 pandas .value_counts 通常用于计算系列中唯一值的数量,但它也可用于使用 bins 参数将值分组到半开箱中。
df['score'].value_counts(bins = 3, sort = False)
默认情况下, .value_counts 按值的降序对返回的系列进行排序。将 sort 设置为 False 以按其索引的升序对系列进行排序。
(-0.101, 33.333] 310 (33.333, 66.667] 340 (66.667, 100.0] 350 Name: score, dtype: int64
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)
(-0.001, 50.0] 488
(50.0, 80.0] 310
(80.0, 100.0] 202
Name: score, dtype: int64
这给了我们与示例 1 和 2 相同的结果。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
如果你经历过数据清洗的过程,你就会明白我的意思。而这正是撰写这篇文章的目的让读者更轻松地进行数据清洗工作。事实上,我在不久前意识到,在进行数据清洗时,有一些数据具有相似的模
这篇文章主要介绍了Python内置函数详细解析,Python 自带了很多的内置函数,极大地方便了我们的开发,下文小编总结了一些内置函数的相关内容,需要的小伙伴可以参考一下
2020.3.7准备scrapy,使用anaconda创建一个新的环境,执行“conda create -n scrapyEnv python=3.6”,结果出现了“CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/win-64/current_repodata.json>”。以下是我的解决步骤。
这篇文章主要为大家详细介绍了Python和C语言如何利用栈的数据结构分别实现将十进制数转换成二进制数,文中的示例代码讲解详细,需要的可以参考一下
python中删除字符串中指定字符的方法:1、使用pop()方法删除特定位置的字符;2、使用replace()方法删除指定字符;3、使用re.sub()方法可以替换特定模式的字符。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008