我使用Pandas的Qcut将我的数据离散化为相等大小的存储桶。我想要价格桶。 这是我的DataFrame:
productId sell_prix categ popularity
11997 16758760.0 28.75 50 524137.0
11998 16758760.0 28.75 50 166795.0
13154 16782105.0 24.60 50 126890.5
13761 16790082.0 65.00 50 245437.0
13762 16790082.0 65.00 50 245242.0
15355 16792720.0 29.00 50 360219.0
15356 16792720.0 29.00 50 360100.0
15357 16792720.0 29.00 50 360027.0
15358 16792720.0 29.00 50 462850.0
15367 16792728.0 29.00 50 193030.5
这是我的代码:
df['PriceBucket'] = pd.qcut(df['sell_prix'], 3)
我有以下错误消息:
**ValueError: Bin edges must be unique: array([ 24.6, 29. , 29. , 65. ])**
实际上,我有一个7413行的DataFrame。所以这只是真实DataFrame的一个示例。奇怪的是,当我使用带有359824行的DataFrame的相同代码时,实际上具有相同的数据,它可以工作!是否与DataFrame的长度有任何关系?
请帮忙!非常感谢。
答案 0 :(得分:3)
讨论了各种解决方案here,但简要说明了一下:
> pd.qcut(df['a'].rank(method='first'), 3)
0 [1, 2.333]
1 [1, 2.333]
2 (2.333, 3.667]
3 (3.667, 5]
4 (3.667, 5]
或者
> pd.qcut(df['a'].rank(method='first'), 3, labels=False)
0 0
1 0
2 1
3 2
4 2
答案 1 :(得分:0)
' sell_prix'较小的DataFrame中的字段没有足够的唯一值来分成三个大小相同的存储区。因此,第一个和第二个存储桶的端点是相同的,这就是您收到错误的原因。
考虑
df = pd.DataFrame([[1,2,3],[1,4,5],[1,5,6],[1,3,4], [2,3,4]], columns = ['a','b','c'])
df
a b c
0 1 2 3
1 1 4 5
2 1 5 6
3 1 3 4
4 2 3 4
pd.qcut(df['a'], 3)
ValueError: Bin edges must be unique: array([ 1., 1., 1., 2.])
尝试使用cut
pd.cut(df['a'], 3)
0 (0.999, 1.333]
1 (0.999, 1.333]
2 (0.999, 1.333]
3 (0.999, 1.333]
4 (1.667, 2]
Name: a, dtype: category
Categories (3, object): [(0.999, 1.333] < (1.333, 1.667] < (1.667, 2]]