我有一个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
之后,仍然出现相同的错误。
我该如何解决?
答案 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 次p>
方法: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))`