Sortieren und Ranking¶
Das Sortieren eines Datensatzes nach einem Kriterium ist eine weitere wichtige eingebaute Funktion. Um lexikografisch nach Zeilen- oder Spaltenindex zu sortieren, verwendet die Methoden pandas.Series.sort_index oder pandas.DataFrame.sort_index, die ein neues, sortiertes Objekt zurückgibt. Mit ascending=False wird die
Sortierreihenfolge umgekehrt:
[1]:
import numpy as np
import pandas as pd
rng = np.random.default_rng()
s = pd.Series(rng.normal(size=7))
s.sort_index(ascending=False)
[1]:
6 0.849312
5 -0.446785
4 -1.180987
3 1.739605
2 1.535317
1 -0.352107
0 0.755917
dtype: float64
Um eine Serie nach ihren Werten zu sortieren, könnt ihr die sort_values-Methode verwenden:
[2]:
s.sort_values()
[2]:
4 -1.180987
5 -0.446785
1 -0.352107
0 0.755917
6 0.849312
2 1.535317
3 1.739605
dtype: float64
Alle fehlenden Werte werden standardmäßig an das Ende der Reihe sortiert:
[3]:
s = pd.Series(rng.normal(size=7))
s[s < 0] = np.nan
s.sort_values()
[3]:
5 0.334075
6 1.507886
0 1.549615
1 NaN
2 NaN
3 NaN
4 NaN
dtype: float64
Mit einem DataFrame können ihr auf beiden Achsen nach Index sortieren:
[4]:
df = pd.DataFrame(rng.normal(size=(7, 3)))
df
[4]:
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | 0.093003 | -0.749562 | -0.492838 |
| 1 | -0.628586 | -0.402284 | -2.079898 |
| 2 | 0.166077 | -0.879292 | 0.970397 |
| 3 | -1.281080 | 0.998237 | 0.099407 |
| 4 | -1.555077 | 2.524556 | -0.291195 |
| 5 | -1.506027 | 0.278702 | 1.187874 |
| 6 | 0.461046 | -0.361845 | 1.671595 |
[5]:
df.sort_index(ascending=False)
[5]:
| 0 | 1 | 2 | |
|---|---|---|---|
| 6 | 0.461046 | -0.361845 | 1.671595 |
| 5 | -1.506027 | 0.278702 | 1.187874 |
| 4 | -1.555077 | 2.524556 | -0.291195 |
| 3 | -1.281080 | 0.998237 | 0.099407 |
| 2 | 0.166077 | -0.879292 | 0.970397 |
| 1 | -0.628586 | -0.402284 | -2.079898 |
| 0 | 0.093003 | -0.749562 | -0.492838 |
[6]:
df.sort_index(axis=1, ascending=False)
[6]:
| 2 | 1 | 0 | |
|---|---|---|---|
| 0 | -0.492838 | -0.749562 | 0.093003 |
| 1 | -2.079898 | -0.402284 | -0.628586 |
| 2 | 0.970397 | -0.879292 | 0.166077 |
| 3 | 0.099407 | 0.998237 | -1.281080 |
| 4 | -0.291195 | 2.524556 | -1.555077 |
| 5 | 1.187874 | 0.278702 | -1.506027 |
| 6 | 1.671595 | -0.361845 | 0.461046 |
Beim Sortieren eines DataFrame könnt ihr die Daten in einer oder mehreren Spalten als Sortierschlüssel verwenden. Dazu übergebt ihr eine oder mehrere Spaltennamen an die Option by von sort_values:
[7]:
df.sort_values(by=2)
[7]:
| 0 | 1 | 2 | |
|---|---|---|---|
| 1 | -0.628586 | -0.402284 | -2.079898 |
| 0 | 0.093003 | -0.749562 | -0.492838 |
| 4 | -1.555077 | 2.524556 | -0.291195 |
| 3 | -1.281080 | 0.998237 | 0.099407 |
| 2 | 0.166077 | -0.879292 | 0.970397 |
| 5 | -1.506027 | 0.278702 | 1.187874 |
| 6 | 0.461046 | -0.361845 | 1.671595 |
Um nach mehreren Spalten zu sortieren, könnt ihr eine Liste von Namen übergeben.
Ranking weist Ränge von eins bis zur Anzahl der gültigen Datenpunkte in einem Array zu:
[8]:
df.rank()
[8]:
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | 5.0 | 2.0 | 2.0 |
| 1 | 4.0 | 3.0 | 1.0 |
| 2 | 6.0 | 1.0 | 5.0 |
| 3 | 3.0 | 6.0 | 4.0 |
| 4 | 1.0 | 7.0 | 3.0 |
| 5 | 2.0 | 5.0 | 6.0 |
| 6 | 7.0 | 4.0 | 7.0 |
Wenn beim Ranking Gleichstände auftauchen, weist rank jeder Gruppe den mittleren Rang zu.
[9]:
df.rank(method="max")
[9]:
| 0 | 1 | 2 | |
|---|---|---|---|
| 0 | 5.0 | 2.0 | 2.0 |
| 1 | 4.0 | 3.0 | 1.0 |
| 2 | 6.0 | 1.0 | 5.0 |
| 3 | 3.0 | 6.0 | 4.0 |
| 4 | 1.0 | 7.0 | 3.0 |
| 5 | 2.0 | 5.0 | 6.0 |
| 6 | 7.0 | 4.0 | 7.0 |
Weitere Verfahren mit rank¶
Methode |
Beschreibung |
|---|---|
|
Standard: jedem Eintrag in der gleichen Gruppe den durchschnittlichen Rang zuweisen |
|
verwendet den minimalen Rang für die gesamte Gruppe |
|
verwendet den maximalen Rang für die gesamte Gruppe |
|
weist die Ränge in der Reihenfolge zu, in der die Werte in den Daten erscheinen |
|
wie |