【问题标题】:pandas using qcut on series with fewer values than quantilespandas 在值少于分位数的系列上使用 qcut
【发布时间】:2017-10-18 10:35:57
【问题描述】:

我有数以千计的系列(DataFrame 的行)需要应用 qcut。定期会有一个系列(行)的值少于所需的分位数(例如,1 个值与 2 个分位数):

>>> s = pd.Series([5, np.nan, np.nan])

当我对其应用.quantile() 时,它没有问题分成2个分位数(具有相同的边界值)

>>> s.quantile([0.5, 1])
0.5    5.0
1.0    5.0
dtype: float64

但是,当我将.qcut() 与分位数的整数值一起应用时,会引发错误:

>>> pd.qcut(s, 2)
...
ValueError: Bin edges must be unique: array([ 5.,  5.,  5.]).
You can drop duplicate edges by setting the 'duplicates' kwarg

即使我设置了duplicates 参数,它仍然失败:

>>> pd.qcut(s, 2, duplicates='drop')
....
IndexError: index 0 is out of bounds for axis 0 with size 0

我该如何进行这项工作? (同样,pd.qcut(s, [0, 0.5, 1], duplicates='drop') 也不起作用。)

所需的输出是将 5.0 分配给单个 bin 并保留 NaN

0     (4.999, 5.000]
1                NaN
2                NaN

【问题讨论】:

  • 您希望 pd.qcut(s, 2) 的输出是什么?您只有 1 个唯一值,为什么要创建 1 个以上的 bin?
  • 我正在提取一个非常具体的案例来解决。实际上,我有数千个系列,所有这些我都需要删减。但是 qcut() 遇到了像这样的异常行的问题。我用所需的输出修改了问题。
  • try-except 块包围qcut 以捕获有缺陷的系列(足够具体,只得到太短的系列)并手动处理太短的系列
  • 您解决了这个问题吗?我遇到了同样的错误,找不到解决方案
  • 不,截至 2018 年 2 月 21 日,原始问题尚无解决方案

标签: pandas quantile


【解决方案1】:

好的,这是一个可能适合您的解决方法。

pd.qcut(s,len(s.dropna()),duplicates='drop')
Out[655]: 
0    (4.999, 5.0]
1             NaN
2             NaN
dtype: category
Categories (1, interval[float64]): [(4.999, 5.0]]

【讨论】:

    【解决方案2】:

    使用 python 3.5 而不是 python 2.7 。 这对我有用

    【讨论】:

    • 您能详细说明原因吗?没有任何用户提出这个问题将能够将他们的项目切换到 3.x,但如果他们能找出问题所在,则可能能够解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 2020-04-15
    • 2013-07-01
    • 2023-02-02
    相关资源
    最近更新 更多