Ich habe eine dataframe
mit über 200 Spalten. Das Problem ist, wie sie generiert wurden, die Reihenfolge ist
['Q1.3','Q6.1','Q1.2','Q1.1',......]
Ich muss die Spalten wie folgt neu anordnen:
['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]
Gibt es eine Möglichkeit für mich, dies in Python zu tun?
df = df.reindex(sorted(df.columns), axis=1)
Dies setzt voraus, dass das Sortieren der Spaltennamen die gewünschte Reihenfolge ergibt. Wenn Ihre Spaltennamen nicht lexikographisch sortiert werden (z. B. wenn Spalte Q10.3 nach Q9.1 erscheinen soll), müssen Sie eine andere Sortierung vornehmen. Dies hat jedoch nichts mit Pandas zu tun.
Sie können es auch knapper machen:
df.sort_index(axis=1)
Stellen Sie sicher, dass Sie das Ergebnis zurückgeben:
df = df.sort_index(axis=1)
Oder machen Sie es vor Ort:
df.sort_index(axis=1, inplace=True)
Sie können einfach tun:
df [sortiert (df.columns)]
Bearbeiten: Kürzer ist
df[sorted(df)]
Tweets Antwort kann mit BrenBarns Antwort weitergegeben werden
data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)
Sagen Sie für Ihr Beispiel:
vals = randint(low=16, high=80, size=25).reshape(5,5)
cols = ['Q1.3', 'Q6.1', 'Q1.2', 'Q9.1', 'Q10.2']
data = DataFrame(vals, columns = cols)
Du kriegst:
data
Q1.3 Q6.1 Q1.2 Q9.1 Q10.2
0 73 29 63 51 72
1 61 29 32 68 57
2 36 49 76 18 37
3 63 61 51 30 31
4 36 66 71 24 77
Dann mach:
data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)
ergebend:
data
Q1.2 Q1.3 Q6.1 Q9.1 Q10.2
0 2 0 1 3 4
1 7 5 6 8 9
2 2 0 1 3 4
3 2 0 1 3 4
4 2 0 1 3 4
Vergessen Sie nicht, der Antwort von Wes "inplace = True" hinzuzufügen oder das Ergebnis auf einen neuen DataFrame zu setzen.
df.sort_index(axis=1, inplace=True)
Wenn Sie anstelle der sortierten Reihenfolge eine beliebige Reihenfolge benötigen, können Sie Folgendes tun:
sequence = ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]
your_dataframe = your_dataframe.reindex(columns=sequence)
Ich habe das in 2.7.10 getestet und es hat für mich funktioniert.
Für mehrere Spalten können Sie die Spaltenreihenfolge nach Ihren Wünschen festlegen:
#['A', 'B', 'C'] <-this is your columns order
df = df[['C', 'B', 'A']]
Dieses Beispiel zeigt das Sortieren und Teilen von Spalten:
d = {'col1':[1, 2, 3], 'col2':[4, 5, 6], 'col3':[7, 8, 9], 'col4':[17, 18, 19]}
df = pandas.DataFrame(d)
Du kriegst:
col1 col2 col3 col4
1 4 7 17
2 5 8 18
3 6 9 19
Dann mach:
df = df[['col3', 'col2', 'col1']]
Ergebend:
col3 col2 col1
7 4 1
8 5 2
9 6 3
Die schnellste Methode ist:
df.sort_index(axis=1)
Beachten Sie, dass dadurch eine neue Instanz erstellt wird. Daher müssen Sie das Ergebnis in einer neuen Variablen speichern:
sortedDf=df.sort_index(axis=1)
Ein Anwendungsfall ist, dass Sie Ihre Spalten (einige) mit einem Präfix benannt haben und die Spalten mit diesen Präfixen alle in einer bestimmten Reihenfolge (nicht alphabetisch) sortiert werden sollen.
Sie könnten beispielsweise alle Funktionen mit Ft_
, Beschriftungen mit Lbl_
usw. beginnen, und Sie möchten zuerst alle nicht fixierten Spalten, dann alle Funktionen und dann die Beschriftung verwenden. Sie können dies mit der folgenden Funktion tun (Ich werde ein mögliches Effizienzproblem mit der Verwendung von sum
feststellen, um Listen zu reduzieren. Dies ist jedoch kein Problem, wenn Sie nicht viele Spalten haben, die ich nicht habe):
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) ], []) ]
Mit der Methode sort
und der Funktion sorted
können Sie eine benutzerdefinierte Funktion bereitstellen, um den zum 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']