Qcut Pandas:ValueError:Bin边缘必须是唯一的

时间:2016-07-11 14:12:23

标签: python arrays pandas dataframe

我使用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的长度有任何关系?

请帮忙!非常感谢。

2 个答案:

答案 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]]