Angenommen , ich habe einen Datenrahmen mit Säulen a
, b
und c
, ich mag den Datenrahmen von Spalte sortieren , b
um in aufsteigend, und durch Spalte c
in absteigender Reihenfolge, wie mache ich das?
Angenommen , ich habe einen Datenrahmen mit Säulen a
, b
und c
, ich mag den Datenrahmen von Spalte sortieren , b
um in aufsteigend, und durch Spalte c
in absteigender Reihenfolge, wie mache ich das?
Antworten:
Ab der Version 0.17.0 wurde die sort
Methode zugunsten von abgelehnt sort_values
. sort
wurde in der Version 0.20.0 vollständig entfernt. Die Argumente (und Ergebnisse) bleiben gleich:
df.sort_values(['a', 'b'], ascending=[True, False])
Sie können das aufsteigende Argument verwenden von sort
:
df.sort(['a', 'b'], ascending=[True, False])
Beispielsweise:
In [11]: df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
In [12]: df1.sort(['a', 'b'], ascending=[True, False])
Out[12]:
a b
2 1 4
7 1 3
1 1 2
3 1 2
4 3 2
6 4 4
0 4 3
9 4 3
5 4 1
8 4 1
Wie von @renadeen kommentiert
Die Sortierung ist standardmäßig nicht vorhanden! Sie sollten also das Ergebnis der Sortiermethode einer Variablen zuweisen oder dem Methodenaufruf inplace = True hinzufügen.
Das heißt, wenn Sie df1 als sortierten DataFrame wiederverwenden möchten:
df1 = df1.sort(['a', 'b'], ascending=[True, False])
oder
df1.sort(['a', 'b'], ascending=[True, False], inplace=True)
sort
Methode einer Variablen zuweisen oder inplace=True
dem Methodenaufruf hinzufügen .
Ab Pandas 0.17.0 DataFrame.sort()
ist es veraltet und wird in einer zukünftigen Version von Pandas entfernt. Die Möglichkeit, einen Datenrahmen nach seinen Werten zu sortieren, ist jetztDataFrame.sort_values
Als solche wäre die Antwort auf Ihre Frage jetzt
df.sort_values(['b', 'c'], ascending=[True, False], inplace=True)
Bei großen Datenrahmen mit numerischen Daten kann es zu einer signifikanten Leistungsverbesserung kommen numpy.lexsort
, bei der eine indirekte Sortierung mithilfe einer Tastenfolge durchgeführt wird:
import pandas as pd
import numpy as np
np.random.seed(0)
df1 = pd.DataFrame(np.random.randint(1, 5, (10,2)), columns=['a','b'])
df1 = pd.concat([df1]*100000)
def pdsort(df1):
return df1.sort_values(['a', 'b'], ascending=[True, False])
def lex(df1):
arr = df1.values
return pd.DataFrame(arr[np.lexsort((-arr[:, 1], arr[:, 0]))])
assert (pdsort(df1).values == lex(df1).values).all()
%timeit pdsort(df1) # 193 ms per loop
%timeit lex(df1) # 143 ms per loop
Eine Besonderheit ist, dass die definierte Sortierreihenfolge mit numpy.lexsort
umgekehrt ist: zuerst (-'b', 'a')
nach Serien sortieren a
. Wir negieren Serien b
, um zu reflektieren, dass wir diese Serien in absteigender Reihenfolge haben möchten.
Beachten Sie, dass np.lexsort
nur mit numerischen Werten sortiert wird, während pd.DataFrame.sort_values
entweder mit Zeichenfolgen oder mit numerischen Werten gearbeitet wird. Die Verwendung np.lexsort
mit Zeichenfolgen ergibt : TypeError: bad operand type for unary -: 'str'
.