2016-07-11 2 views
1

Я использую Qcut из Pandas, чтобы дискретировать свои данные в ведрах равного размера. Я хочу иметь ведра цен. Это мой DataFrame:Qcut Pandas: ValueError: края кромок должны быть уникальными

 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. ])** 

На самом деле, у меня есть DataFrame с 7413 строками. Таким образом, это всего лишь выборка реального DataFrame. Странно то, что когда я использую тот же код с DataFrame с 359824 строками, с практически теми же данными, он работает! Есть ли зависимость от длины DataFrame?

Помогите пожалуйста! Большое спасибо.

+0

если вы отсортируете столбец df, это сработает? 'df ['PriceBucket'] = pd.qcut (df ['sell_prix']. sort_values ​​(), 3)' – EdChum

+0

не хватает уникальных значений в 'sell_prix' в вашей меньшей части данных, чтобы разбить диапазон на 3 ковши. Следовательно, конечные точки первого и среднего ведер совпадают, поэтому вы получаете ошибку – Fortunato

+0

См. Http://stackoverflow.com/questions/20158597/how-to-qcut-with-non-unique-bin-edges ? rq = 1 – dukebody

ответ

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]] 
+0

cut() не функционально эквивалентен qcut. Это приведет к нежелательным результатам. – ldmtwo

0

Различные решения обсуждаются 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 
Смежные вопросы