Назначьте диапазоны ковша силой 2 в отдельном столбце в пандах - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть столбец значений, как показано ниже:

col
12
76
34

, для которого мне нужно создать новый столбец с метками сегментов для col1, как указано ниже:

col1     bucket-labels
12            8-16
76            64-128 
34            32-64

Здесь значения в столбце могут отличаться и количество результатов также.

Редактировать: интервалы метки сегмента должны быть в диапазоне 2 ^ n

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Сначала получите максимальное значение степени 2 по одному из решений из здесь , создайте ячейки по списку, пометите zip и передайте его функции cut:

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
0 голосов
/ 15 ноября 2018

Использование pd.cut с 2 power корзинами:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...