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