Python 排列数组:排除NaN并将最低排列分配给最高编号

Python 排列数组:排除NaN并将最低排列分配给最高编号,python,arrays,pandas,numpy,rank,Python,Arrays,Pandas,Numpy,Rank,我有一个数组/行: array = [0.8, np.nan, 0.1, -0.5, 0.7] 我想要这个输出: array = [1, np.nan, 3, 4, 2] 对我来说,这些方法的排名方向是错误的: scipy.stats.mstats.rankdata scipy.stats.rankdata 这里有一个方法- mask = ~np.isnan(a) out = np.full(a.size,np.nan) out[mask] = np.unique(-a[mask],ret

我有一个数组/行:

array = [0.8, np.nan, 0.1, -0.5, 0.7]
我想要这个输出:

array = [1, np.nan, 3, 4, 2]
对我来说,这些方法的排名方向是错误的:

scipy.stats.mstats.rankdata
scipy.stats.rankdata
这里有一个方法-

mask = ~np.isnan(a)
out = np.full(a.size,np.nan)
out[mask] = np.unique(-a[mask],return_inverse=1)[1]+1
样本运行-

In [48]: a
Out[48]: array([ 0.8,  nan,  0.1, -0.5,  nan,  0.7])

In [49]: out
Out[49]: array([  1.,  nan,   3.,   4.,  nan,   2.])

既然您提到熊猫,您可以使用以下方法:

这将创建并返回熊猫系列。如果您想避免创建一个系列,正如@ajcr在注释中所指出的,您可以使用rank函数。这将返回一个ndarray:

pd.algos.rank_1d_float64(arr, ascending=False)
Out: array([  1.,  nan,   3.,   4.,   2.])

如果这些函数不支持
反向
选项,只需对
-array
进行排序即可。您还可以更直接地访问rank函数,并使用
pd.algos.rank\u 1d\u float64(array,升序=False)
,从而避免创建序列的开销(但不确定这是公共API的一部分)。
pd.algos.rank_1d_float64(arr, ascending=False)
Out: array([  1.,  nan,   3.,   4.,   2.])