标签:pandas,between方法
有时候,我们需要执行数据分箱操作,pandas的between方法可以帮助我们实现这个目的。数据分箱(Databinning)是指我们将数据放入离散区间或段/箱的过程。
我们将创建一些随机样本,显示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
pandas的between方法检查数据是否在两个值之间,其语法为:
between(left,right,inclusive=’both’)
其中,
- 参数left,分段/范围的下端点。
- 参数right,分段/范围的上端点。
- 参数inclusive,是否想要包括下端点和上端点,可以取下列值:both,neither,left或right。
该方法返回一个布尔索引,其中包含True和False值的列表。
让我们检查哪个记录的年龄介于0到20岁之间:
df['Age'].between(0,20, inclusive='right')
图2
可能注意到between方法实质上等同于:
(df['Age']> 0) & (df['Age'] <= 20)
图3
现在,可以借助布尔索引检查数据是否在一个分段内,还需要使用loc方法来访问/赋值符合条件的单个记录的值。注意,NaN值是因为尚未为其指定band列。
df.loc[df['Age'].between(left=0,right=20, inclusive='right'),
'band']= '(0, 20]'
图4
基本上,loc属性只返回与条件匹配的记录,即布尔索引中的True值。参见下面的示例,该示例仅返回0到20年前的记录。
df.loc[df['Age'].between(left=0,right=20,inclusive='right')]
图5
假设我们要将所有数据放入以下年龄段中。注:括号“()”表示不包含,方括号“[]”表示包含,因此(0,20]是指从1岁到20岁。
(0,20]
(20,60]
(60,90]
(90,120]
代码:
#年龄间隔
age_band= [0,20,60,90,120]
#创建年龄段
age_bins= []
for i in range(4):
age_bins.append([age_band[i],age_band[i 1]])
[[0,20],[20,60], [60,90], [90,120]]
#分箱数据
for b in age_bins:
df.loc[df['Age'].between(left=b[0],right=b[1],inclusive='right'),'band']= f'({b[0]},{b[1]}]'
结果如下图6所示。
图6
不幸的是,使用between和loc方法无法轻松地将数据装箱。虽然使用循环并不太糟糕,但在处理大量的分箱时,这种方法可能会变得效率低下,因为需要将该过程重复N次(箱子数量)。获取分箱数据的一种更简单的方法是使用pandas的cut方法,具体参见:《Pandas基础:使用Cut方法进行数据分箱(Binning Data)》。
注:本文学习整理自pythoninoffice.com,供有兴趣的朋友参考。