То, что у меня сейчас выглядит, выглядит так:
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) с таким же количеством наблюдений в нем? Спасибо!
Если получите ошибку:
неподдерживаемые типы операндов для +: '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
df['bins'] = pd.qcut(df['spread'], 3, labels=list('ABC'))