我有一个类似
的dfdf= 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
与总和进行比较来设置值来实现这一点。但我想知道是否有使用熊猫魔术的方法
答案 0 :(得分:0)
如果您的数据帧较大,则此解决方案非常糟糕,但是这里的解决方案与您的解决方案有所不同且更简单(很好):
pd.qcut(np.concatenate([[s]*v for s,v in zip(df.s, df.v)]), 3, labels=[-1,0,1])
您可以事先在cumsum
上使用v
来检查计算机是否会在...之前爆炸。