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