Мой вопрос такой же, как и предыдущий:
Объединение с нулевыми значениями в pandas
однако, я все же хочу включить значения 0 в фрактал. Есть ли способ сделать это? Другими словами, если у меня есть 600 значений, 50% из которых равны 0, а остальным - от 1 до 100, как бы классифицировать все значения 0 в фрактале 1, а затем остальные ненулевые значения в метрических меток с 2 по 10 (при условии, что я хочу 10 фракций). Могу ли я преобразовать 0 в nan, qcut оставшиеся не-нано данные в 9 фракций (от 1 до 9), затем добавить 1 к каждой метке (теперь от 2 до 10) и пометить все значения 0 как фрактали 1 вручную? Даже это сложно, потому что в моих данных, помимо 600 значений, у меня также есть еще пара сотен, которые уже могут быть наном, прежде чем я переконвертирую 0s в nan.
Обновление 1/26/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