我现在所拥有的看起来像这样: 传播
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之间,则它是bin A的一部分,如果(例如)介于0.00005和0.0006之间,则bin 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'))
但是,当我这样做时,所有内容最终都进入了Bin A:
spread Bin
0 0.00000787 A
1 0.00000785 A
2 0.00000749 A
3 0.00000788 A
4 0.00000786 A
有人知道如何将“传播”列分为三个具有相同观察值的箱(A-B-C)吗?谢谢!
答案 0 :(得分:1)
如果出现错误:
+不支持的操作数类型:'decimal.Decimal'和'float'
这意味着列类型为Decimal,在熊猫中不能很好地工作,应将其转换为数字。
一种可能的解决方案是将列乘以某个较大的数字,例如10e15并转换为整数,以避免在转换为浮点数然后使用qcut
时失去精度:
gem 'bootstrap-datepicker-rails'
gem 'bootstrap', '~> 4.2', '>= 4.2.1'
gem 'jquery-rails', '~> 4.3', '>= 4.3.3'
没有新列的解决方案:
#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