大熊猫为基于另一列加权的列创建分位数

时间:2018-07-02 09:32:57

标签: python pandas

我有一个类似

的df
df= pd.DataFrame({'v': [100, 300, 200, 900, 100, 400, 300, 300, 800, 1100], 's':[1.1, 2.7, 0.87, 1.6, 3.2, 0.2, 1.1, 0.3, 1.2, 1.3]})


    s       v
0   1.10    100
1   2.70    300
2   0.87    200
3   1.60    900
4   3.20    100
5   0.20    400
6   1.10    300
7   0.30    300
8   1.20    800
9   1.30    1100

我想获得与

几乎相似的分位数
pd.qcut(df["s"], 3,labels=[-1, 0, 1])

但是我不想让每个bin包含相等数量的条目,而是希望创建bin以使每个类别的v之和相等。

类似

df= pd.DataFrame({'v': [100, 300, 200, 900, 100, 400, 300, 300, 800, 1100], 's':[1.1, 2.7, 0.87, 1.6, 3.2, 0.2, 1.1, 0.3, 1.2, 1.3] ,\
              'c': [-1, 1, -1, 1, 1, -1, -1, -1, 0, 0]})


   c    s   v
0   -1  1.10    100
1   1   2.70    300
2   -1  0.87    200
3   1   1.60    900
4   1   3.20    100
5   -1  0.20    400
6   -1  1.10    300
7   -1  0.30    300
8   0   1.20    800
9   0   1.30    1100

插值没有太大关系,因为实际设置很大。 我可以通过对s进行排序,对v进行cumsum,然后根据将cumsum与总和进行比较来设置值来实现这一点。但我想知道是否有使用熊猫魔术的方法

1 个答案:

答案 0 :(得分:0)

如果您的数据帧较大,则此解决方案非常糟糕,但是这里的解决方案与您的解决方案有所不同且更简单(很好):

pd.qcut(np.concatenate([[s]*v for s,v in zip(df.s, df.v)]), 3, labels=[-1,0,1])

您可以事先在cumsum上使用v来检查计算机是否会在...之前爆炸。

相关问题