如何在python中创建自定义垃圾箱

时间:2019-11-01 09:53:09

标签: python-3.x pandas

我想使用pandas cut函数在数据框中为CUSTOMER_AGE创建bin。我尝试使用下面的代码:

bins = [0,20,25, 30, 35, 40,45,50,55, 60,150]
labels = ['0-20yrs', '21-25 yrs', '26-30 yrs', '31-35 yrs','36-40 yrs', 
           '41-45 yrs', '46-50 yrs','51-55 yrs', '56-59 yrs', '> 60yrs']
df['BINS'] = pd.cut(df.CUSTOMER_AGE, bins, labels = labels,include_lowest = True)

这是我得到的输出:

CUSTOMER_AGE               BIN
 20                      0-20 yrs
 38                      36-40 yrs
 58                      56-59 yrs
 60                      56-59 yrs
 60                      56-59 yrs
 72                      > 60 yrs
 61                      > 60 yrs
 60                      56-59 yrs
 80                      > 60 yrs 

我想知道为什么只有60岁的客户落在“ 56-59岁”分类下而不是“> 60岁”下。 但是,年龄超过60岁的客户会进入正确的分类箱,即“> 60岁”

1 个答案:

答案 0 :(得分:0)

我认为您需要cut中的right=False才能将closed='right'更改为closed='left'

  

:bool,默认为 True

     

指示垃圾箱是否包括最右边。如果right == True(默认值),则bins [1、2、3、4]表示(1,2],(2,3],(3,4]。当bins是IntervalIndex时,将忽略此参数

df['BINS'] = pd.cut(df.CUSTOMER_AGE, bins, labels = labels,include_lowest = True, right=False)
print (df)
   CUSTOMER_AGE        BIN       BINS
0            20   0-20 yrs  21-25 yrs
1            38  36-40 yrs  36-40 yrs
2            58  56-59 yrs  56-59 yrs
3            60  56-59 yrs    > 60yrs
4            60  56-59 yrs    > 60yrs
5            72   > 60 yrs    > 60yrs
6            61   > 60 yrs    > 60yrs
7            60  56-59 yrs    > 60yrs
8            80   > 60 yrs    > 60yrs

要更好地理解,请检查Interval

  

一个闭合区间(用方括号表示的数学形式)包含其端点,即闭合区间[0,5]的特征是条件0 <= x <=5。这就是close ='both'代表的意思。开放时间间隔(用括号表示的数学形式)不包含其端点,即开放时间间隔(0,5)的条件是0 半开或半闭,即 [0,5) 0 <= x < 5 (closed ='left')和(0,5] 0 (closed ='right')描述。 / p>

,并在不使用label参数的情况下进行检查:

df['BINS_l'] = pd.cut(df.CUSTOMER_AGE, bins, include_lowest = True, right=True)
df['BINS_r'] = pd.cut(df.CUSTOMER_AGE, bins, include_lowest = True, right=False)
print (df)
   CUSTOMER_AGE        BIN          BINS_l     BINS_r
0            20   0-20 yrs  (-0.001, 20.0]   [20, 25)
1            38  36-40 yrs    (35.0, 40.0]   [35, 40)
2            58  56-59 yrs    (55.0, 60.0]   [55, 60)
3            60  56-59 yrs    (55.0, 60.0]  [60, 150)
4            60  56-59 yrs    (55.0, 60.0]  [60, 150)
5            72   > 60 yrs   (60.0, 150.0]  [60, 150)
6            61   > 60 yrs   (60.0, 150.0]  [60, 150)
7            60  56-59 yrs    (55.0, 60.0]  [60, 150)
8            80   > 60 yrs   (60.0, 150.0]  [60, 150)

因此,如果您看到(60.0, 150.0],则表示60.0 < x <= 150.0(排除了60值)。

但是在第二列中是[60, 150),表示60 <= x < 150(包括60值)。