pandas 在值少于分位数的系列上使用 qcut

Zha*_*g18 8 quantile pandas

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

>>> s = pd.Series([5, np.nan, np.nan])
Run Code Online (Sandbox Code Playgroud)

当我应用.quantile()它时,它可以毫无问题地分成两个分位数(具有相同的边界值)

>>> s.quantile([0.5, 1])
0.5    5.0
1.0    5.0
dtype: float64
Run Code Online (Sandbox Code Playgroud)

但是,当我应用.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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

0     (4.999, 5.000]
1                NaN
2                NaN
Run Code Online (Sandbox Code Playgroud)

All*_*len 7

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

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]]
Run Code Online (Sandbox Code Playgroud)