Qcut熊猫:ValueError:bin边缘必须是唯一的

2024-05-19 12:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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行的数据帧。所以这只是真实数据帧的一个采样。奇怪的是,当我对359824行的数据帧使用相同的代码时,实际上使用了相同的数据,它就工作了!数据帧的长度有什么关系吗?

救命啊!非常感谢。


Tags: 数据代码pandasdf错误价格pdcateg
2条回答

较小数据帧中的“sell-prix”字段没有足够的唯一值,无法分成三个大小相等的存储桶。因此,第一个和第二个bucket的端点是相同的,这就是为什么您会得到一个错误。

考虑

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]]

讨论了各种解决方案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

相关问题 更多 >