Ранжировать массив: исключить NaN и присвоить наименьший ранг наибольшему числу


У меня есть строка array / pandas:

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

2 ответа:

Поскольку вы упомянули панд, вы можете использовать серию .ранг Метод:

arr = [0.8, np.nan, 0.1, -0.5, 0.7]
pd.Series(arr).rank(ascending=False)
Out: 
0    1.0
1    NaN
2    3.0
3    4.0
4    2.0
dtype: float64

Это создает и возвращает серию панд. Если вы хотите избежать создания ряда, как было отмечено в комментариях @ajcr,вы можете использовать функцию rank. Это возвращает ndarray:

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

Вот такой подход -

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