панды, использующие qcut для серий с меньшим количеством значений, чем квантили

У меня есть тысячи серий (строк DataFrame), к которым мне нужно применить qcut. Периодически будет появляться серия (строка), в которой меньше значений, чем желаемый квантиль (скажем, 1 значение против 2 квантилей):

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

Когда я применяю к нему .quantile(), он без проблем разбивается на 2 квантиля (одного и того же граничного значения)

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

Но когда я применяю .qcut() с целочисленным значением для количества квантилей, возникает ошибка:

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

Даже после того, как я установил аргумент duplicates, он все равно не работает:

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

Как мне заставить это работать? (И, что то же самое, pd.qcut(s, [0, 0.5, 1], duplicates='drop') тоже не работает.)

Желаемый результат состоит в том, чтобы 5.0 было назначено одному бину, а NaN сохранено:

0     (4.999, 5.000]
1                NaN
2                NaN

person Zhang18    schedule 18.05.2017    source источник
comment
Каков ваш желаемый результат для pd.qcut(s, 2)? У вас есть только 1 уникальное значение, и почему вы хотите создать более 1 ячейки?   -  person Allen    schedule 18.05.2017
comment
Я извлекаю очень специфический случай для рассмотрения. На самом деле у меня тысячи Серий, и все их нужно вырезать. Но qcut() сталкивается с проблемой с такой строкой выброса. Я изменил вопрос с желаемым результатом.   -  person Zhang18    schedule 19.05.2017
comment
окружите qcut блоком try-except, чтобы поймать неисправную серию (будьте достаточно конкретными, чтобы получить только слишком короткие) и обработайте слишком короткие sem-вручную   -  person Maarten Fabré    schedule 19.05.2017
comment
вам удалось решить это? Я получаю ту же ошибку и не могу найти решение   -  person jeangelj    schedule 16.02.2018
comment
Нет, по состоянию на 21.02.2018 решение исходной проблемы неизвестно.   -  person Zhang18    schedule 21.02.2018


Ответы (2)


Хорошо, это обходной путь, который может сработать для вас.

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]]
person Allen    schedule 20.05.2017

Используйте Python 3.5 вместо Python 2.7. Это сработало для меня

person Tarun Talreja    schedule 01.11.2017
comment
Можете ли вы уточнить, почему? Ни один пользователь, задающий этот вопрос, не сможет переключить свой проект на 3.x, но может решить проблему, если узнает, что это такое. - person toonarmycaptain; 01.11.2017