Diese Frage ist ein paar Jahre alt und die akzeptierte Antwort ist großartig, aber ich denke, das Folgende ist immer noch erwähnenswert. Wenn Ihnen die Abhängigkeit nichts ausmacht scipy
, können Sie Folgendes verwenden scipy.stats.rankdata
:
In [22]: from scipy.stats import rankdata
In [23]: a = [4, 2, 7, 1]
In [24]: rankdata(a)
Out[24]: array([ 3., 2., 4., 1.])
In [25]: (rankdata(a) - 1).astype(int)
Out[25]: array([2, 1, 3, 0])
Ein nettes Merkmal von rankdata
ist, dass das method
Argument mehrere Optionen für den Umgang mit Bindungen bietet. Zum Beispiel gibt es drei Vorkommen von 20 und zwei Vorkommen von 40 in b
:
In [26]: b = [40, 20, 70, 10, 20, 50, 30, 40, 20]
Die Standardeinstellung weist den gebundenen Werten den Durchschnittsrang zu:
In [27]: rankdata(b)
Out[27]: array([ 6.5, 3. , 9. , 1. , 3. , 8. , 5. , 6.5, 3. ])
method='ordinal'
weist aufeinanderfolgende Ränge zu:
In [28]: rankdata(b, method='ordinal')
Out[28]: array([6, 2, 9, 1, 3, 8, 5, 7, 4])
method='min'
weist allen gebundenen Werten den Mindestrang der gebundenen Werte zu:
In [29]: rankdata(b, method='min')
Out[29]: array([6, 2, 9, 1, 2, 8, 5, 6, 2])
Weitere Optionen finden Sie in der Dokumentzeichenfolge.
ranks = temp.argsort()
.