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 边缘必须是唯一的的主要内容,如果未能解决你的问题,请参考以下文章

pandas的qcut()方法

区别|Pandas-qcut( )与cut( )的区别

Python Pandas 使用 pd.qcut 创建新的 bin/bucket 变量

熊猫 groupby 和 qcut

pandas高级操作总结

将熊猫间隔转换为字符串(然后再返回)