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