Natürlich Pandas DataFrame sortieren

8

Ich habe einen Pandas DataFrame mit Indizes, die ich natürlich sortieren möchte. Natsort scheint nicht zu funktionieren. Das Sortieren der Indizes vor dem Erstellen des DataFrame scheint nicht hilfreich zu sein, da die Manipulationen, die ich mit dem DataFrame mache, die Sortierung im Prozess durcheinander bringen. Irgendwelche Gedanken darüber, wie ich die Indizes natürlich aufgreifen kann?

%Vor%     
agf1997 11.04.2015, 17:40
quelle

2 Antworten

6

Wenn Sie das df sortieren wollen, sortieren Sie einfach den Index oder die Daten und weisen Sie direkt dem Index des df zu, anstatt zu versuchen, das df als arg zu übergeben, da dies eine leere Liste ergibt:

%Vor%

Beachten Sie, dass df.index = natsorted(df.index) auch funktioniert

Wenn Sie das df als arg übergeben, ergibt es eine leere Liste, in diesem Fall, weil das df leer ist (hat keine Spalten), sonst gibt es die sortierten Spalten zurück, die nicht das sind, was Sie wollen:

%Vor%

BEARBEITEN

Wenn Sie den Index so sortieren möchten, dass die Daten zusammen mit dem Index neu geordnet werden, verwenden Sie reindex :

%Vor%

Beachten Sie, dass Sie das Ergebnis von reindex entweder einem neuen df oder sich selbst zuweisen müssen, das inplace param nicht akzeptiert.

    
EdChum 11.04.2015, 17:43
quelle
13

Die akzeptierte Antwort beantwortet die gestellte Frage. Ich möchte auch hinzufügen, wie natsort für Spalten in einem DataFrame verwendet wird, da dies die nächste Frage sein wird.

%Vor%

Wie die akzeptierte Antwort zeigt, ist die Sortierung nach dem Index ziemlich einfach:

%Vor%

Wenn Sie auf dieselbe Weise nach einer Spalte sortieren möchten, müssen Sie den Index nach der Reihenfolge sortieren, in der die gewünschte Spalte neu angeordnet wurde. natsort stellt die Komfortfunktionen index_natsorted und order_by_index zur Verfügung, um genau das zu tun.

%Vor%

Wenn Sie eine beliebige Anzahl von Spalten (oder eine Spalte und den Index) neu anordnen möchten, können Sie zip (oder itertools.izip auf Python2) verwenden, um die Sortierung für mehrere Spalten anzugeben. Die erste Spalte wird die primäre Sortierspalte sein, dann sekundär, dann tertiär, usw. ...

%Vor%

Hier ist eine alternative Methode, die Categorical -Objekte verwendet, die mir von pandas devs mitgeteilt wurde, ist der "richtige" Weg, dies zu tun. Dies erfordert (soweit ich sehen kann) Pandas & gt; = 0,16,0. Momentan funktioniert es nur für Spalten, aber scheinbar in Pandas & gt; = 0.17.0 fügen sie CategoricalIndex hinzu, was es erlaubt, diese Methode für einen Index zu verwenden.

%Vor%

Mit dem Objekt Categorical können Sie eine Sortierreihenfolge definieren, die DataFrame verwendet. Die beim Aufruf von reorder_categories angegebenen Elemente müssen eindeutig sein, daher der Aufruf von set für Spalte "b".

Ich überlasse es dem Benutzer zu entscheiden, ob das besser ist als die Methode reindex oder nicht, da Sie die Spaltendaten unabhängig voneinander sortieren müssen, bevor Sie in DataFrame sortieren (obwohl ich mir vorstelle, dass die zweite Sortierung eher ist effizient).

Vollständige Offenlegung, ich bin der natsort Autor.

    
SethMMorton 11.04.2015 20:28
quelle