Pandas 将铲斗范围以2的幂分配到表中的单独列中

Pandas 将铲斗范围以2的幂分配到表中的单独列中,pandas,dataframe,Pandas,Dataframe,我有一列值,如下所示: col 12 76 34 为此,我需要为col1生成一个新列,其中包含桶标签,如下所述: col1 bucket-labels 12 8-16 76 64-128 34 32-64 在这里,列中的值可能会有所不同,结果的数量也会有所不同 编辑: 铲斗标签的间隔应在2^n范围内,与2个功率箱一起使用: bins = [2**i for i in range(0,int(np.log2(df.co

我有一列值,如下所示:

col
12
76
34
为此,我需要为
col1
生成一个新列,其中包含桶标签,如下所述:

col1     bucket-labels
12            8-16
76            64-128 
34            32-64
在这里,列中的值可能会有所不同,结果的数量也会有所不同

编辑: 铲斗标签的间隔应在2^n范围内,与
2个功率
箱一起使用:

bins = [2**i for i in range(0,int(np.log2(df.col.max()))+2)]
#alternative [2**i for i in range(0,np.ceil(np.log2(df.col.max()))+1)]
bin_labels = [f'{x}-{y}' for x, y in zip(bins[:-1], bins[1:])]
df['bucket-labels'] = pd.cut(df.col, bins=bins, labels=bin_labels)

print(df)
   col bucket-labels
0   12          8-16
1   76        64-128
2   34         32-64

首先通过解决方案中的一个获得幂2的最大值,通过列表理解创建箱子,通过
zip
标记并将其传递给函数:

import math
a = df['col'].max()
bins = [1<<exponent for exponent in range(math.ceil(math.log(a, 2))+1)]
#another solution
#bins = [1<<exponent for exponent in range((int(a)-1).bit_length() + 1)]
print (bins)
[1, 2, 4, 8, 16, 32, 64, 128]

labels = ['{}-{}'.format(i, j) for i, j in zip(bins[:-1], bins[1:])] 

df['bucket-labels'] = pd.cut(df['col'], bins=bins, labels=labels)
print (df)
   col bucket-labels
0   12          8-16
1   34         32-64
2   76        64-128
导入数学
a=df['col'].max()

bins=[1是否间隔总是介于范围2^n中的值之间?是的,间隔总是介于范围2^n中的值之间?我认为可能不需要创建标签[pd.cut(df.col,bins).astype(str).str.slice(start=1,stop=-1).str.replace(',','-')]@jazreal:谢谢你的回答,我可以得到我需要的准确结果。但是,还有一种情况是,我忘了提到小于2的值的情况,即0到2之间的值的桶值。例如:如果
col
上的值是
0.7
,那么桶范围应该是
0.5-1.0
。我已经尝试了下面是我得到的
ValueError:math domain error
列值-0.7
bins=[1@ManikanthaNekkalapudi-因此,对于
0-2
之间的值是多个存储桶吗?如
0-0.5
0.5-1
1-1.5
1.5-2
?是的,多个存储桶,但它应该符合我之前的条件,即存储桶范围在2^n范围内。
0.7
属于
(2^-1)-(2^0))
。在这种情况下,范围
1-1.5
1.5-2
不合适。
2
的幂应该是
int
@ManikanthaNekkalapudi-因此有必要添加一个类似
0-1
的箱子,那么箱子是
0,1,2,4,8,