Pandas:把柱子分成三个大小完全相同的箱子

2024-10-03 21:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我现在的情况是这样的: 散布

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

我想在它旁边添加一个新的列,如果spread的值在(例如)0到0.00005之间,那么它是bin a的一部分,如果(例如)在0.00005到0.0006之间,那么bin B(总共有三个bin)。到目前为止,我尝试了:

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'))

但当我这么做的时候,所有的东西都会被扔进垃圾箱:

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

有没有人知道如何将列“spread”划分为三个具有相同观察数的容器(A-B-C)?谢谢!你知道吗


Tags: dfifbin情况floatminelsemax
1条回答
网友
1楼 · 发布于 2024-10-03 21:28:57

如果获取错误:

unsupported operand type(s) for +: 'decimal.Decimal' and 'float'

这意味着列类型是Decimal,这对于pandas来说效果很差,应该转换为numeric。你知道吗

一种可能的解决方案是将列乘以一些大的数字,例如10e15,然后转换为整数,以避免在转换为浮点时丢失精度,然后使用^{}

#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

相关问题 更多 >