我现在拥有的看起来像这样: 传播
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),其中具有相同数量的观察值?谢谢!
最佳答案
如果出现错误:
unsupported operand type(s) for +: 'decimal.Decimal' and 'float'
这意味着列类型为 Decimal,与 pandas 配合不佳,应转换为 numeric。
一种可能的解决方案是将列乘以一些大数字,例如10e15 并转换为整数以避免在转换为 float 时丢失精度,然后使用 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
关于python - Pandas:将列分成三个大小完全相同的箱子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54144168/