Панды: разделите столбец на три корзины одинакового размера

1

То, что у меня сейчас выглядит, выглядит так:

0  0.00000787  
1  0.00000785  
2  0.00000749  
3  0.00000788  
4  0.00000786  
5  0.00000538  
6  0.00000472  
7  0.00000759  

И я хотел бы добавить новый столбец рядом с ним, и если значение спреда между (например) 0 и 0,00005, то это часть бина A, если (например) между 0,00005 и 0,0006, то бин B (там три ящика в общей сложности). Что я уже пробовал:

minspread = df['spread'].min()
maxspread = df['spread'].max()
born = (float(maxspread)-float(minspread))/3
born1 = born + float(minspread)
born2 = float(maxspread) - born


df['Bin'] = df['spread'].apply(lambda x: 'A' if x < born1 else ( 'B' if born1 < x <= born2 else 'C'))

Но когда я делаю это, все заканчивается в корзине A:

    spread    Bin                              
0  0.00000787   A   
1  0.00000785   A   
2  0.00000749   A                                  
3  0.00000788   A                                  
4  0.00000786   A 

У кого-нибудь есть идея о том, как разделить столбец "спред" на три ячейки (ABC) с таким же количеством наблюдений в нем? Спасибо!

  • 0
    Я думаю, что вам нужно df['bins'] = pd.qcut(df['spread'], 3, labels=list('ABC'))
  • 0
    У меня есть сообщение об ошибке: неподдерживаемые типы операндов для +: 'decimal.Decimal' и 'float'
Показать ещё 4 комментария
Теги:
pandas

1 ответ

1
Лучший ответ

Если получите ошибку:

неподдерживаемые типы операндов для +: 'decimal.Decimal' и 'float'

Это означает, что тип столбца - Десятичный, который плохо работает с пандами и должен быть преобразован в числовой.

Одним из возможных решений является умножение столбцов на некоторое большое число, например 10e15, и преобразование в целое число, чтобы избежать потери точности при преобразовании в числа с плавающей запятой, а затем использовать qcut:

#sample data
#from decimal import Decimal
#df['spread'] = [Decimal(x) for x in df['spread']]

df['spread1'] = (df['spread'] * 10**15).astype(np.int64)
df['bins'] = pd.qcut(df['spread1'], 3, labels=list('ABC'))
print (df)

       spread     spread1 bins
0  0.00000787  7870000000    C
1  0.00000785  7850000000    B
2  0.00000749  7490000000    A
3  0.00000788  7880000000    C
4  0.00000786  7860000000    C
5  0.00000538  5380000000    A
6  0.00000472  4720000000    A
7  0.00000759  7590000000    B

Решение без новой колонки:

s = (df['spread'] * 10**15).astype(np.int64)
df['bins'] = pd.qcut(s, 3, labels=list('ABC'))
print (df)

       spread bins
0  0.00000787    C
1  0.00000785    B
2  0.00000749    A
3  0.00000788    C
4  0.00000786    C
5  0.00000538    A
6  0.00000472    A
7  0.00000759    B

Ещё вопросы

Сообщество Overcoder
Наверх
Меню