498 Stimmen

Sortieren von Spalten in Pandas Dataframe basierend auf dem Spaltennamen

Ich habe eine dataframe mit über 200 Spalten. Das Problem ist, dass die Reihenfolge, in der sie generiert wurden, wie folgt ist

['Q1.3','Q6.1','Q1.2','Q1.1',......]

Ich muss die Spalten wie folgt sortieren:

['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]

Gibt es eine Möglichkeit für mich, dies innerhalb von Python zu tun?

21voto

M.Z Punkte 223

Wenn Sie eine beliebige Reihenfolge anstelle einer sortierten Reihenfolge benötigen, können Sie dies tun:

sequence = ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]
your_dataframe = your_dataframe.reindex(columns=sequence)

Ich habe dies in 2.7.10 getestet und es hat funktioniert.

16voto

burkesquires Punkte 1295

Vergessen Sie nicht, "inplace=True" zu Wes' Antwort hinzuzufügen oder das Ergebnis in einen neuen DataFrame zu setzen.

df.sort_index(axis=1, inplace=True)

4voto

multigoodverse Punkte 6688

Das ist die schnellste Methode:

df.sort_index(axis=1)

Beachten Sie, dass dadurch eine neue Instanz erzeugt wird. Daher müssen Sie das Ergebnis in einer neuen Variablen speichern:

sortedDf=df.sort_index(axis=1)

1voto

tweet Punkte 115

En sort Methode und sorted Funktion können Sie eine benutzerdefinierte Funktion bereitstellen, um den für den Vergleich verwendeten Schlüssel zu extrahieren:

>>> ls = ['Q1.3', 'Q6.1', 'Q1.2']
>>> sorted(ls, key=lambda x: float(x[1:]))
['Q1.2', 'Q1.3', 'Q6.1']

1voto

Roko Mijic Punkte 5857

Ein Anwendungsfall ist, dass Sie (einige) Ihrer Spalten mit einem Präfix benannt haben und die Spalten mit diesen Präfixen alle zusammen und in einer bestimmten Reihenfolge (nicht alphabetisch) sortiert haben möchten.

Sie könnten zum Beispiel alle Ihre Funktionen mit Ft_ , Etiketten mit Lbl_ usw., und Sie wollen zuerst alle nicht vorangestellten Spalten, dann alle Merkmale und dann die Bezeichnung. Sie können dies mit der folgenden Funktion erreichen (ich weise auf ein mögliches Effizienzproblem bei der Verwendung von sum um Listen zu reduzieren, aber das ist kein Problem, es sei denn, Sie haben sehr viele Spalten, was bei mir nicht der Fall ist):

def sortedcols(df, groups = ['Ft_', 'Lbl_'] ):
    return df[ sum([list(filter(re.compile(r).search, list(df.columns).copy())) for r in (lambda l: ['^(?!(%s))' % '|'.join(l)] + ['^%s' % i  for i in l ] )(groups)   ], [])  ]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X