我想使用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岁”
答案 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
值)。