传递pd.qcut重复='drop'kwarg后,“容器标签必须比容器边缘的数量少一个”

时间:2019-12-25 21:39:08

标签: python pandas

我有一个df,具有成千上万的行,并且正在创建一个新的数据框,该数据框仅包含某些值组的行的最高分位数:

quantiles = (df.groupby(['Person', 'Date'])['Value'].apply(lambda x: pd.qcut(x, 4, labels=[0, 0.25, 0.5, 1], duplicates='drop')))

运行它,我得到:

ValueError: Bin labels must be one fewer than the number of bin edges

尝试将bins的数量更改为5之后,仍然出现相同的错误。

我该如何解决?

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我这样做是为了克服它。

bins = 数据被切片的次数

labels = 您使用标签进行分类的范围。

<块引用>

labels > bins 时出现此错误

请按照以下步骤操作:

步骤。 1:一开始不要传标签

train['MasVnrArea'] = pd.qcut(train['MasVnrArea'],
                          q=5,duplicates='drop')

这将导致:

(-0.001, 16.0]     880
(205.2, 1600.0]    292
(16.0, 205.2]      288
Name: MasVnrArea, dtype: int64

第 2 步:

现在我们可以看到只有三个类别可以进行分箱。 因此,相应地分配标签。在我的例子中,它是 3。所以我传递了 3 个标签。

bin_labels_MasVnrArea = ['Platinum_MasVnrArea', 
                         'Diamond_MasVnrArea','Supreme_MasVnrArea']
train['MasVnrArea'] = pd.qcut(train['MasVnrArea'],
                              q=5,labels=bin_labels_MasVnrArea,duplicates='drop')

请在垃圾箱上观看此视频以获得清晰的理解。

https://www.youtube.com/watch?v=HofOMf8RgjM

答案 1 :(得分:0)

发生这种情况是因为,在从某些组中删除重复项后,传递的标签大小大于您传递的剪切参数的数量。您必须使其动态化,就像它出现的任何地方都只生成标签一样。

方法:1

df.groupby(key)['sales'].transform(lambda x: pd.qcut(x, min(len(x),3), labels=range(1,min(len(x),3)+1), duplicates = 'drop'))

这里我最多做 3 次切割,但如果不可能,至少做 1 或 2 次

方法:2

import pandas as pd
df['rank'] = df.groupby([key])[sales].transform(lambda x: x.rank(method = 'first'))

def q_cut(x, cuts):
    unique_var = len(np.unique([i for i in x]))
    labels1 = range(1, min(unique_var,cuts)+1)
    output = pd.qcut(x, min(unique_var,cuts), labels= labels1, duplicates = 'drop')
    return output

df.groupby([key])['rank'].transform(lambda x: q_cut(x,10))`