Qcut Pandas:ValueError:Bin 边缘必须是唯一的
Posted
技术标签:
【中文标题】Qcut Pandas:ValueError:Bin 边缘必须是唯一的【英文标题】:Qcut Pandas : ValueError: Bin edges must be unique 【发布时间】:2016-11-13 12:44:02 【问题描述】:我正在使用 Pandas 的 Qcut 来将我的数据离散化为大小相等的存储桶。我想要价格桶。 这是我的数据框:
productId sell_prix categ popularity
11997 16758760.0 28.75 50 524137.0
11998 16758760.0 28.75 50 166795.0
13154 16782105.0 24.60 50 126890.5
13761 16790082.0 65.00 50 245437.0
13762 16790082.0 65.00 50 245242.0
15355 16792720.0 29.00 50 360219.0
15356 16792720.0 29.00 50 360100.0
15357 16792720.0 29.00 50 360027.0
15358 16792720.0 29.00 50 462850.0
15367 16792728.0 29.00 50 193030.5
这是我的代码:
df['PriceBucket'] = pd.qcut(df['sell_prix'], 3)
我有这个错误信息:
**ValueError: Bin edges must be unique: array([ 24.6, 29. , 29. , 65. ])**
实际上,我有一个包含 7413 行的 DataFrame。所以这只是真实 DataFrame 的一个样本。奇怪的是,当我对具有 359824 行的 DataFrame 使用相同的代码时,使用几乎相同的数据,它可以工作! DataFrame 的长度是否有任何依赖性?
请帮忙!非常感谢。
【问题讨论】:
如果您对 df 列进行排序,它是否有效?df['PriceBucket'] = pd.qcut(df['sell_prix'].sort_values(), 3)
在较小的数据框中,“sell_prix”中没有足够的唯一值,无法将范围分成 3 个存储桶。因此,第一个和中间桶的端点是相同的,这就是您收到错误的原因
见***.com/questions/20158597/…
【参考方案1】:
较小的 DataFrame 中的“sell_prix”字段没有足够的唯一值来分成三个大小相同的存储桶。结果,第一个和第二个存储桶的端点相同,这就是您收到错误的原因。
考虑
df = pd.DataFrame([[1,2,3],[1,4,5],[1,5,6],[1,3,4], [2,3,4]], columns = ['a','b','c'])
df
a b c
0 1 2 3
1 1 4 5
2 1 5 6
3 1 3 4
4 2 3 4
pd.qcut(df['a'], 3)
ValueError: Bin edges must be unique: array([ 1., 1., 1., 2.])
尝试使用cut
pd.cut(df['a'], 3)
0 (0.999, 1.333]
1 (0.999, 1.333]
2 (0.999, 1.333]
3 (0.999, 1.333]
4 (1.667, 2]
Name: a, dtype: category
Categories (3, object): [(0.999, 1.333] < (1.333, 1.667] < (1.667, 2]]
【讨论】:
cut() 在功能上不等同于 qcut。它会产生不希望的结果。【参考方案2】:讨论了各种解决方案here,但简要:
> pd.qcut(df['a'].rank(method='first'), 3)
0 [1, 2.333]
1 [1, 2.333]
2 (2.333, 3.667]
3 (3.667, 5]
4 (3.667, 5]
或者
> pd.qcut(df['a'].rank(method='first'), 3, labels=False)
0 0
1 0
2 1
3 2
4 2
【讨论】:
以上是关于Qcut Pandas:ValueError:Bin 边缘必须是唯一的的主要内容,如果未能解决你的问题,请参考以下文章