我的问题和上一个一样:
但是,我仍然希望在一个分数中包含0值。有办法吗?换句话说,如果我有600个值,其中50% 是0,其余的在1到100之间,那么我如何将分数1中的所有0值归类,然后将其余的非零值归类到分数标签2到10(假设我想要10个分数)。我是否可以将0转换为 nan,将剩余的非 nan 数据切割成9个分数(1到9) ,然后向每个标签(现在是2到10)添加1,并将所有0值手动标记为分数1?即使这是棘手的,因为在我的数据集除了600个值之外,我还有另外几百个可能已经是 nan 的值,在我将0转换成 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