2017-05-18 8 views
1

Ich habe Tausende von Serien (Zeilen eines DataFrame), die ich qcut anwenden muss. Von Zeit zu Zeit gibt es eine Reihe (Zeile), die weniger Werte als die gewünschte Quantil (etwa 1 Wert vs 2 Quantile) hat:Pandas mit qcut auf Serie mit weniger Werten als Quantile

>>> s = pd.Series([5, np.nan, np.nan]) 

Wenn ich mich bewerben .quantile() es, hat es kein Problem in 2 quantiles brechen (der gleiche Grenzwert)

>>> s.quantile([0.5, 1]) 
0.5 5.0 
1.0 5.0 
dtype: float64 

Aber wenn ich .qcut() mit einem ganzzahligen Wert für die Anzahl der Quantile ein Fehler gelten geworfen:

>>> pd.qcut(s, 2) 
... 
ValueError: Bin edges must be unique: array([ 5., 5., 5.]). 
You can drop duplicate edges by setting the 'duplicates' kwarg 

Eve n, nachdem ich das duplicates Argument, es immer noch nicht:

>>> pd.qcut(s, 2, duplicates='drop') 
.... 
IndexError: index 0 is out of bounds for axis 0 with size 0 

Wie kann ich diese Arbeit zu machen? (Und äquivalent ist pd.qcut(s, [0, 0.5, 1], duplicates='drop') auch nicht.)

Die gewünschte Ausgabe ist die 5.0 zu einem einzelnen Behälter zugeordnet haben und die NaN sind erhalten:

0  (4.999, 5.000] 
1    NaN 
2    NaN 
+0

Was ist Ihre gewünschte Ausgabe für pd.qcut (s, 2)? Sie haben nur einen eindeutigen Wert und warum möchten Sie mehr als 1 Behälter erstellen? – Allen

+0

Ich extrahiere einen sehr spezifischen Fall zu adressieren. In Wirklichkeit habe ich Tausende von Serien, die ich alle schneiden muss. Aber qcut() hat Probleme mit einer Ausreißerzeile wie dieser. Ich habe die Frage mit der gewünschten Ausgabe modifiziert. – Zhang18

+0

Umgeben Sie die 'qcut' mit einem' try-except' Block, um die fehlerhafte Serie zu fangen (Seien Sie spezifisch genug, um nur die zu kurz zu bekommen) und beschäftigen Sie sich mit den zu kurz sem-manuellen –

Antwort

2

Ok, das ist eine Behelfslösung die möglicherweise Arbeite für dich.

pd.qcut(s,len(s.dropna()),duplicates='drop') 
Out[655]: 
0 (4.999, 5.0] 
1    NaN 
2    NaN 
dtype: category 
Categories (1, interval[float64]): [(4.999, 5.0]] 
0

Verwenden Sie Python 3.5 anstelle von Python 2.7. Dies funktionierte für mich

+2

Können Sie näher erläutern, warum? Benutzer, die nicht auf diese Frage kommen, können ihr Projekt auf 3.x umstellen, aber sie können das Problem möglicherweise umgehen, wenn sie herausfinden können, was es ist. – toonarmycaptain