我一直在尝试将一组值 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
上执行 qcut
,50-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)
这应该可以工作。
下面是我的数组数据:
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
上执行 qcut
,50-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)
这应该可以工作。