前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Pandas基础:使用Cut方法进行数据分箱(Binning Data)

Pandas基础:使用Cut方法进行数据分箱(Binning Data)

作者头像
fanjy
发布2022-06-04 09:40:58
2.8K0
发布2022-06-04 09:40:58
举报
文章被收录于专栏:完美Excel完美Excel

标签:pandas,cut方法

有时候,我们需要执行数据分箱操作,而pandas提供了一个方便的方法cut可以实现。

在下面的简单数据集中,有一组100人,他们的年龄和净值以美元计。我们想把这些人分为不同的年龄段并进行分析。

import pandas as pd

import numpy as np

age= np.random.randint(0,121,size=100)

net_worth= np.random.randint(100,10000,size=100)

df= pd.DataFrame({'Age':age, 'Net_Worth':net_worth})

如下图1所示。

图1

现在,让我们创建年龄数据分箱,即年龄段。我们可以简单使用下面的整数列表来构建箱子:

age_band= [0,20,30,40,50,65,70,90]

这些整数用作标注(band)每段的下限和上限。例如:

(0,20]

(20,30]

(30,40]

……

执行简单的cut操作。注意,第一个参数应该是一维数组类型的对象。结果是一个pandas系列,包含每个记录的年龄段,如下所示:

pd.cut(df['Age'],bins=age_band)

图2

可以将此年龄段列存储到数据框架中,以保留每条记录的段信息。看看下面的结果:第一个记录年龄是40岁;因此,它被置于(30,40]年龄段。注意到数据集底部的一些NaN值。

df['band']= pd.cut(df['Age'], bins=age_band)

图3

之所以使用NaN值,是因为我们创建的分段没有覆盖数据集中的最大值。要对所有记录进行装箱,需要包含一个最大年龄为110岁的数据点。基本上,我们增加了另一个年龄段90至110岁。再次数据分箱将为所有记录创建年龄段,如下所示。

age_band= [0,20,30,40,50,65,70,90,110]

df['band']= pd.cut(df['Age'], bins=age_band)

图4

默认情况下,bins是“右包含”的,这意味着箱子包括最右边的上限值。例如,第一个数据点的年龄段为(30,40]。注意,此处使用了不同的括号。括号“(”表示不包括,而方括号“]”表示包括。因此(30,40]表示30岁至40岁(包括)。

可以通过使用right参数来控制是包含左端点还是右端点。下面的示例变为左包含,如标注(band)列左侧的方括号“[”所示。

df['band']= pd.cut(df['Age'], bins=age_band, right=False)

图5

还可以通过将所需标签列表传递给labels参数来更改bin标签,而不是使用标注(band)/范围(range)。注意,标签的长度必须等于分箱的数量。例如:

df['band']= pd.cut(df['Age'], bins=age_band, right=False, labels=list('ABCDEFGH'))

图6

现在,我们已经为所有记录创建了箱子,可以使用groupby方法汇总数据。下面的示例显示了每个年龄组的平均净值。注意,数据是随机生成的,因此没有什么意义,但该技术仍然是合理的。

df['band']= pd.cut(df['Age'], bins=age_band)

df.groupby(by='band').agg({'Net_Worth':'mean'})

图7

注:本文学习整理自pythoninoffice.com,供有兴趣的朋友参考。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档