Как сделать qcut с неуникальными ребрами?

Мой вопрос такой же, как этот предыдущий:

Биннинг с нулевыми значениями в пандах

Тем не менее, я все еще хочу включить значения 0 в fractile. Есть ли способ сделать это? Другими словами, если у меня есть 600 значений, 50% из которых равны 0, а остальные разрешеныскажем, от 1 до 100, как бы я классифицировал все значения 0 в фрактиле 1, а затем остальные ненулевые значения в метках фрактиля 2–10 (при условии, что я хочу 10 фрагментов). Могу ли я конвертировать 0 's to nan, q нарезать оставшиеся данные non nan на 9 фрагментов (от 1 до 9), затем добавить 1 к каждой метке (теперь от 2 до 10) и вручную пометить все значения 0 как фракцию 1? Даже это сложно, потому что в моем наборе данных в дополнение к 600 значениям у меня также есть еще пара сотен, которые могут быть уже в нан, прежде чем я переведу 0 в нано.

Обновление от 26.01.14:

Я придумал следующее временное решение. Однако проблема с этим кодом заключается в том, что если значение высокой частоты находится не по краям распределения, то оно вставляет дополнительный бин в середину существующего набора бинов и отбрасывает все немного (или много).

def fractile_cut(ser, num_fractiles):
    num_valid = ser.valid().shape[0]
    remain_fractiles = num_fractiles
    vcounts = ser.value_counts()
    high_freq = []
    i = 0
    while vcounts.iloc[i] > num_valid/ float(remain_fractiles):
        curr_val = vcounts.index[i]
        high_freq.append(curr_val)
        remain_fractiles -= 1
        num_valid = num_valid - vcounts[i]
        i += 1
    curr_ser = ser.copy()
    curr_ser = curr_ser[~curr_ser.isin(high_freq)]
    qcut = pd.qcut(curr_ser, remain_fractiles, retbins=True)
    qcut_bins = qcut[1]
    all_bins = list(qcut_bins)
    for val in high_freq:
        bisect.insort(all_bins, val)
    cut = pd.cut(ser, bins=all_bins)
    ser_fractiles = pd.Series(cut.labels + 1, index=ser.index)
    return ser_fractiles

Ответы на вопрос(5)

Ваш ответ на вопрос