python - Pandas:将列分成三个大小完全相同的箱子

标签 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),其中具有相同数量的观察值?谢谢!

最佳答案

如果出现错误:

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/

相关文章:

python - 确定类属性是否为只读数据描述符

python - 用python解析outlook .msg文件

python - 将一列从一个 DataFrame 复制到另一个会给出 NaN 值?

python - 对每一列相关性独立排序并得到索引值

python - 为什么 datetime.strptime 在这个简单的例子中不起作用?

python - 实现子表(查看表): designing class relationship

Python:按键、值比较两个相同的字典

python - 如何将 pandas Series 的 "rows"转换为 DataFrame 的列?

python - Pandas:在单独的列中显示嵌套字典值

python - 从 Pandas 数据框转换为 TensorFlow 张量对象