Pandas对数值进行分箱操作的4种方法总结
作者:Python数据分析实例 发布时间:2023-08-09 02:52:04
前言
使用 Pandas 的between 、cut、qcut 和 value_count离散化数值变量。
分箱是一种常见的数据预处理技术有时也被称为分桶或离散化,他可用于将连续数据的间隔分组到“箱”或“桶”中。在本文中,我们将讨论使用 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 之间。
参数有下面三个:
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()
C 488
B 310
A 202
Name: grade, dtype: int64
此方法需要为每个 bin 编写处理的代码,因此它仅适用于 bin 很少的情况。
2、cut
可以使用 cut将值分类为离散的间隔。此函数对于从连续变量到分类变量也很有用。
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()
C 488
B 310
A 202
Name: grade, dtype: int64
结果与上面示例相同。
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()
print (cut_bin)
>> [ 0. 36. 68. 100.]
分数间隔如下:
C:[0, 36]
B:(36, 68]
A:(68, 100]
使用 .value_counts() 检查每个等级有多少学生。理想情况下,每个箱应该有大约 333 名学生。
df.grade.value_counts()
C 340
A 331
B 329
Name: grade, dtype: int64
4、value_counts
虽然 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 相同的结果。
来源:https://mp.weixin.qq.com/s/5GLxREVIdh623IUVL0u55Q
猜你喜欢
- .xls格式 Office2003及以下版本 .xlsx格式Offi
- 缓存是基于Application实现的CacheState类,建议实例化时用名Cache程序代码<% Class Cache
- 各大著名厂家、公司的banner广告设计欣赏,尺寸468x60,gif格式!有acer,阿尔卡特,AMD,中国电信,爱立信,Greatwal
- 困扰我很久问题终于在昨天被解决了。其实问题很简单<% =now %>老是显示12小时制,总是出现上午、下午。这个问题虽然很小,但
- 大致功能:$() 取得所有元素$("div") 取得所有DIV$("#a1") 取得ID为a1的元素
- 参数让我们进一步看看CPU的数量是如何影响这些参数的。 参数fast_start_parallel_rollback Oracle并行机制中
- 用DIV+CSS可以作出很多不同形状的角形;以下我只写了几个;CSS没有优化;是为了让大家看得更清一些;以下是一些小三角的形状:这是第一个小
- http://validator.w3.org/#validate_by_upload 在线校验网址点浏览,上次找到自己做的页面
- 很开心可以和导师阿坚在08gui大赛中一起去完成《fight》的图标设计,在这个过程中真的是受益匪浅!这里我谈一下在这个过程的一些小小心得。
- ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写 的,主要用于创建前端用户界面,是一个与后台技术无关的
- 内容摘要:您是否想让您的网站有多种显示风格呢,本文介绍了如何使用CSS结合js实现动态更换页面皮肤风格。看了下面的介绍您就明白了如何实现了这
- 高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法
- 如下所示:a[:, np.newaxis] # 给a最外层中括号中的每一个元素加[]a[np.newaxis, :] # 给a最外层中括号中
- 相关代码如下: 1. 创建sequence: 代码如下:CREATE SEQUENCE SEQU_DATA_DATAINFO IN
- 在使用 SQL Server 的过程中,用户遇到的最多的问题莫过于连接失败了。一般而言,有以下两种连接 SQL Server 的方式,一是利
- 我认为在ASP中最好的办法是用编程实现定时刷新Cache,也就是说给Application中储存的设一个过期时间。当然,在ASP中Appli
- from keras.utils.np_utils import to_categorical注意:当使用categorical_cross
- 如何做一个检索结果带链接的检索?具体代码和说明如下:<% data=request.form("search_da
- 本文实例讲述了Go语言转换所有字符串为大写或者小写的方法。分享给大家供大家参考。具体如下:Go语言的string模块包含了ToLower和T
- 就我个人经验来讲:除了oracle,没有比HP 客户支持中心更糟糕的体验了。刚买不到一个月的HP MINI笔记本,莫名其妙键盘上的引号键松动