gpt4 book ai didi

python - 如何使用非唯一的 bin 边缘进行 qcut?

转载 作者:IT老高 更新时间:2023-10-28 20:35:12 30 4
gpt4 key购买 nike

我的问题和上一个一样:

Binning with zero values in pandas

但是,我仍然想在分位数中包含 0 值。有没有办法做到这一点?换句话说,如果我有 600 个值,其中 50% 是 0,其余的值在 1 到 100 之间,我将如何对分位数 1 中的所有 0 值进行分类,然后对其余的非零值进行分类在分数标签 2 到 10 中(假设我想要 10 个分数)。我可以将 0 转换为 nan,将剩余的非 nan 数据qcut 为 9 个分位数(1 到 9),然后将 1 添加到每个标签(现在是 2 到 10)并手动将所有 0 值标记为分位数 1?即使这也很棘手,因为在我的数据集中,除了 600 个值之外,我还有另外几百个可能已经是 nan 在我将 0 转换为 nan 之前。

14 年 1 月 26 日更新:

我想出了以下临时解决方案。不过,这段代码的问题是,如果高频值不在分布的边缘,那么它会在现有的一组 bin 中间插入一个额外的 bin,并把所有东西都扔掉一点(或很多)。

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

最佳答案

问题是 pandas.qcut 选择 bin/quantiles 以使每个都有相同数量的记录,但是具有相同值的所有记录必须保留在相同的 bin/quantile 中(这行为符合分位数的统计定义)。

解决方案是:

1 - 使用具有 this fix 的 pandas >= 0.20.0 .他们添加了一个选项 duplicates='raise'|'drop' 来控制是在重复的边缘上提升还是丢弃它们,这将导致 bin 比指定的少,而有些更大(包含更多元素)比其他人。

2 - 减少 分位数的数量。更少的分位数意味着每个分位数更多的元素

3 - 使用 DataFrame.rank(method='first') 对您的数据进行排名。排名为数据框中的每个元素(排名)分配一个唯一的值,同时保持元素的顺序(相同的值除外,它们将按照它们在数组中出现的顺序进行排名,参见 method='first')

例子:

pd.qcut(df, nbins) <-- this generates "ValueError: Bin edges must be unique"

然后改用这个:

pd.qcut(df.rank(method='first'), nbins)

4 - 指定一个自定义分位数范围,例如[0, .50, .75, 1.] 获得每个分位数不相等的项目数

5 - 使用 pandas.cut,根据值本身选择要均匀分布的 bin,而 pandas.qcut 选择 bin,以便每个 bin 中的记录数相同

关于python - 如何使用非唯一的 bin 边缘进行 qcut?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20158597/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com