熊猫:将列分成三个大小完全相同的容器

时间:2019-01-11 09:59:45

标签: python pandas

我现在所拥有的看起来像这样: 传播

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)吗?谢谢!

1 个答案:

答案 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