2016-07-11 14 views
1

Ich verwende Qcut von Pandas, um meine Daten in gleich große Buckets zu diskretisieren. Ich möchte Preis Eimer haben. Das ist mein Datenrahmen:Qcut Pandas: ValueError: Behälterränder müssen eindeutig sein

 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 

Und dies ist mein Code:

df['PriceBucket'] = pd.qcut(df['sell_prix'], 3) 

ich diese Fehlermeldung haben:

**ValueError: Bin edges must be unique: array([ 24.6, 29. , 29. , 65. ])** 

In Wirklichkeit, ich habe einen Datenrahmen mit 7413 Zeilen. Das ist also nur ein Ausschnitt des echten DataFrames. Das Seltsame ist, dass wenn ich den gleichen Code mit einem DataFrame mit 359824 Zeilen verwende, mit praktisch den gleichen Daten, es funktioniert! Gibt es eine Abhängigkeit von der Länge von DataFrame?

Hilfe bitte! Danke vielmals.

+0

Wenn Sie die Spalte df sortieren funktioniert es? 'df ['PriceBucket'] = pd.qcut (df ['sell_prix']. sort_values ​​(), 3)' – EdChum

+0

Es gibt nicht genug eindeutige Werte in 'sell_prix' in Ihrem kleineren Datenrahmen, um den Bereich in 3 Buckets aufzuteilen. Daher sind die Endpunkte der ersten und mittleren Buckets identisch, weshalb Sie einen Fehler erhalten – Fortunato

+0

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

Antwort

0

Das Feld 'sell_prix' in Ihrem kleineren Datenrahmen hat nicht genügend eindeutige Werte, um in drei gleich große Buckets zu springen. Daher sind der Endpunkt des ersten und zweiten Buckets identisch, weshalb Sie einen Fehler erhalten.

Betrachten

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

versuchen Sie es mit 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() ist nicht funktional äquivalent zu qcut. Es wird unerwünschte Ergebnisse erzeugen. – ldmtwo

0

sind verschiedene Lösungen here diskutiert, aber kurz:

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

Oder

> pd.qcut(df['a'].rank(method='first'), 3, labels=False) 
0 0 
1 0 
2 1 
3 2 
4 2 
Verwandte Themen