Die accepted answer beantwortet die Frage, die gestellt wird. Ich möchte auch hinzufügen, wie natsort
auf Spalten in einem DataFrame
zu verwenden, da dies die nächste Frage sein wird.
In [1]: from pandas import DataFrame
In [2]: from natsort import natsorted, index_natsorted, order_by_index
In [3]: df = DataFrame({'a': ['a5', 'a1', 'a10', 'a2', 'a12'], 'b': ['b1', 'b1', 'b2', 'b2', 'b1']}, index=['0hr', '128hr', '72hr', '48hr', '96hr'])
In [4]: df
Out[4]:
a b
0hr a5 b1
128hr a1 b1
72hr a10 b2
48hr a2 b2
96hr a12 b1
Wie die accepted answer zeigt, durch den Sortier-Index ist recht einfach:
In [5]: df.reindex(index=natsorted(df.index))
Out[5]:
a b
0hr a5 b1
48hr a2 b2
72hr a10 b2
96hr a12 b1
128hr a1 b1
Wenn Sie auf einer Säule in der gleichen Weise zu sortieren, können Sie den Index nach der Reihenfolge sortieren müssen, dass die gewünschte Säule wurde neu geordnet. natsort
bietet die Komfortfunktionen index_natsorted
und order_by_index
, um genau das zu tun.
In [6]: df.reindex(index=order_by_index(df.index, index_natsorted(df.a)))
Out[6]:
a b
128hr a1 b1
48hr a2 b2
0hr a5 b1
72hr a10 b2
96hr a12 b1
In [7]: df.reindex(index=order_by_index(df.index, index_natsorted(df.b)))
Out[7]:
a b
0hr a5 b1
128hr a1 b1
96hr a12 b1
72hr a10 b2
48hr a2 b2
Wenn Sie mit einer beliebigen Anzahl von Spalten (oder einer Spalte und dem Index) neu anordnen möchten, können Sie zip
(oder itertools.izip
auf Python2) verwenden, um das Sortieren über mehrere Spalten angeben. Die erste Spalte gegeben wird die primäre Sortierspalte, dann sekundär sein, dann tertiär, etc ...
In [8]: df.reindex(index=order_by_index(df.index, index_natsorted(zip(df.b, df.a))))
Out[8]:
a b
128hr a1 b1
0hr a5 b1
96hr a12 b1
48hr a2 b2
72hr a10 b2
In [9]: df.reindex(index=order_by_index(df.index, index_natsorted(zip(df.b, df.index))))
Out[9]:
a b
0hr a5 b1
96hr a12 b1
128hr a1 b1
48hr a2 b2
72hr a10 b2
Hier ist eine alternative Methode unter Verwendung von Categorical
Objekten, die ich von dem pandas
devs gesagt worden ist "richtige" Art und Weise, dies zu tun. Dies erfordert (soweit ich das sehe) Pandas> = 0.16.0. Momentan funktioniert es nur für Spalten, aber scheinbar in Pandas> = 0.17.0 fügen sie CategoricalIndex
hinzu, was es erlaubt, diese Methode für einen Index zu verwenden.
In [1]: from pandas import DataFrame
In [2]: from natsort import natsorted
In [3]: df = DataFrame({'a': ['a5', 'a1', 'a10', 'a2', 'a12'], 'b': ['b1', 'b1', 'b2', 'b2', 'b1']}, index=['0hr', '128hr', '72hr', '48hr', '96hr'])
In [4]: df.a = df.a.astype('category')
In [5]: df.a.cat.reorder_categories(natsorted(df.a), inplace=True, ordered=True)
In [6]: df.b = df.b.astype('category')
In [8]: df.b.cat.reorder_categories(natsorted(set(df.b)), inplace=True, ordered=True)
In [9]: df.sort('a')
Out[9]:
a b
128hr a1 b1
48hr a2 b2
0hr a5 b1
72hr a10 b2
96hr a12 b1
In [10]: df.sort('b')
Out[10]:
a b
0hr a5 b1
128hr a1 b1
96hr a12 b1
72hr a10 b2
48hr a2 b2
In [11]: df.sort(['b', 'a'])
Out[11]:
a b
128hr a1 b1
0hr a5 b1
96hr a12 b1
48hr a2 b2
72hr a10 b2
Das Categorical
Objekt können Sie eine Sortierreihenfolge für die DataFrame
definieren zu verwenden.Die Elemente, die beim Aufruf von reorder_categories
angegeben werden, müssen eindeutig sein, daher der Aufruf an set
für die Spalte "b".
Ich überlasse es dem Benutzer zu entscheiden, ob dies besser ist als die reindex
Methode oder nicht, da Sie die Spaltendaten unabhängig vor dem Sortieren innerhalb der DataFrame
sortieren müssen (obwohl ich mir vorstellen, dass zweite Sortierung ist ziemlich effizient).
Volle Offenlegung, ich bin der natsort
Autor.
@sethMMorton Ich vermutete, dass 'df3.index' dasselbe wie' c' ist, während die Daten sortiert werden, um sie inline mit ihren Indexwerten zu halten – agf1997
Es wäre schön, wenn 'pd.sort' einen' Schlüssel hätte 'Option, aber es nicht. [Diese Antwort] (http://stackoverflow.com/a/27009771/1399279) bietet eine Problemumgehung, mit der Sie einen aus 'natsort_keygen' generierten Schlüssel übergeben können. – SethMMorton
Ich habe gerade eine offizielle Anfrage an die 'Pandas' Devs gemacht,' Schlüssel' zu den 'sort' Methoden hier hinzuzufügen: https://github.com/pydata/pandas/issues/9855 – SethMMorton