У меня есть тысячи серий (строк 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
qcut
блокомtry-except
, чтобы поймать неисправную серию (будьте достаточно конкретными, чтобы получить только слишком короткие) и обработайте слишком короткие sem-вручную - person Maarten Fabré   schedule 19.05.2017