我一直在尝试将一组值 qcut 分成 4 个 bin。我收到以下错误?如何解决这个问题我是 Python 的初学者

I have been trying to qcut an array of values into 4 bins. I am getting the error below? How to solve this I am a beginner in Python

下面是我的数组数据: wkx_old['Sales point'].values

数组([ 2, 2, 2, 4, 4, 3, 1, 4, 2, 1, 3, 4, 1, 1, 4, 7, 4, 1, 1, 2, 4, 3, 4, 3, 3, 2, 5, 2, 3, 2, 3, 4, 2, 10, 4, 4, 6, 3, 3, 1, 1, 2, 1, 3, 2, 4, 5, 2, 4, 3, 2, 3, 4, 3, 1, 1, 6, 3, 6, 5, 7, 2, 1, 1, 6, 5, 1, 1, 1, 2, 2, 1, 2, 2, 4, 4, 1, 5, 7, 2, 1, 2, 1, 5, 3, 1, 1, 2, 3, 3, 5, 4, 4, 6, 1, 4, 4, 1, 3, 4, 4, 5, 4, 4, 1, 1, 3, 1, 2, 1, 3, 7, 2, 1, 1, 3, 3, 6, 1, 6、2、3、7、1])

正在尝试计算以下代码:

names=['D','C','B','A']

wkx_old['Rankings'] = pd.qcut(wkx_old['Sales point'],q=4,labels=names)

我得到的错误: ValueError:Bin 边缘必须是唯一的:array([ 1., 1., 3., 4., 10.])。 您可以通过设置 'duplicates' kwarg

来删除重复边

qcut 对重复数据不友好,当它在分裂点看到重复时会抛出错误。假设您在 [1]*100 上执行 qcut50-th 百分位数是多少?

您可以尝试 rank(pct=True) 计算该值的实际百分位数,然后 cut:

wkx_old['Rankings'] = pd.cut(wkx_old['Sales point'].rank(pct=True), 
                             bins=4, labels=names)

输出:

0      C
1      C
2      C
3      B
4      B
      ..
119    A
120    C
121    C
122    A
123    D
Length: 124, dtype: category
Categories (4, object): ['D' < 'C' < 'B' < 'A']

您的代码有两个问题:

  • qcut 尝试调整 windows 的大小,使每个 window 的元素数量大致相同。由于您的数据中有很多 1,它将根据错误消息尝试创建此 window: array([ 1., 1., 3., 4., 10.])。前两个条目是相同的,这将导致您看到的错误。要解决此问题,请将参数 duplicates='drop' 添加到 qcut:
pd.qcut(wkx_old['Sales point'], q=4, duplicates='drop')
  • 第二个问题是你的names列表有4个元素长,但是你把数据切割成5windows(q=4是切割的数量)。要解决此问题,只需将另一个元素添加到列表中:
names = ['E', 'D', 'C', 'B', 'A']
pd.qcut(wkx_old['Sales point'], q=4, duplicates='drop', labels=names)

这应该可以工作。