对数组进行排序:排除 NaN 并将最低排序分配给最高数字
Rank an array: Exclude NaN and assign lowest rank to highest number
我有一个 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
这是一个方法 -
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.])
既然你提到了Pandas,你可以使用Series.rank方法:
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
这会创建 returns 一个 Pandas 系列。如果你想避免创建系列,正如@ajcr 在评论中指出的那样,你可以使用 rank 函数。这个 returns 一个 ndarray:
pd.algos.rank_1d_float64(arr, ascending=False)
Out: array([ 1., nan, 3., 4., 2.])
我有一个 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
这是一个方法 -
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.])
既然你提到了Pandas,你可以使用Series.rank方法:
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
这会创建 returns 一个 Pandas 系列。如果你想避免创建系列,正如@ajcr 在评论中指出的那样,你可以使用 rank 函数。这个 returns 一个 ndarray:
pd.algos.rank_1d_float64(arr, ascending=False)
Out: array([ 1., nan, 3., 4., 2.])