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

2022-06-04 09:40:58 浏览数 (2)

标签: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,供有兴趣的朋友参考。

0 人点赞