首页 > 解决方案 > Pandas:使用 qcut(data,3) 后,如何找到分位数的范围

问题描述

我的数据如下所示:

    spread                              CPB%    Bin  
0  0.00000787  0.001270648030495552731893265565   B  
1  0.00000785  0.003821656050955414012738853503   A  
2  0.00000749  0.005821656050955414012738853503   C  
3  0.00000788  0.004821656050955414012738853503   B

所以我基本上根据他们的价差分配了一个字母A,B或C。我已经使用以下代码完成了此操作:

s = (df['spread'] * 10**15).astype(np.int64)
df['Bin'] = pd.qcut(s, 3, labels=list('ABC'))

我现在需要做的是,我有 100 个点差(从 0.000001 到 0.0001),我需要知道它们是否最终出现在 Bin A、B 或 C 中。有没有办法找到让我们说“范围”上述分位数?

更准确地说,我有以下点差:

      spread
0   0.000100
1   0.000109
2   0.000118
3   0.000127
4   0.000136
5   0.000145

我怎么知道它们最终是否与上面的 ABC 放在同一个垃圾箱中?谢谢

标签: pythonpandas

解决方案


我相信您需要为返回间隔添加参数retbins=Trueqcut因此可以在以下位置重用它cut

print (df1)
     spread      CPB% Bin
0  0.000008  0.001271   B
1  0.000008  0.003822   A
2  0.000007  0.005822   C
3  0.000008  0.004822   B

print (df2)
     spread
0  0.000008 <-change data sample for match
1  0.000109
2  0.000118
3  0.000127
4  0.000136
5  0.000145

s = (df1['spread'] * 10**15).astype(np.int64)
v,b = pd.qcut(s, 3, labels=list('ABC'),retbins=True)
print (v)
0    B
1    A
2    A
3    C
Name: spread, dtype: category
Categories (3, object): [A < B < C]

print (b)
[7490000000 7849999999 7869999999 7880000000]


s1 = (df2['spread'] * 10**15).astype(np.int64)
df2['new'] = pd.cut(s1, bins=b, labels=v.cat.categories)
print (df2)
     spread  new
0  0.000008    A
1  0.000109  NaN
2  0.000118  NaN
3  0.000127  NaN
4  0.000136  NaN
5  0.000145  NaN

推荐阅读