it-swarm.com.de

Spalten in Pandas-Datenrahmen nach Spaltennamen neu anordnen

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?

200
pythOnometrist
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.

240
BrenBarn

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)
252
Wes McKinney

Sie können einfach tun:

 df [sortiert (df.columns)] 

Bearbeiten: Kürzer ist 

df[sorted(df)]
23
Ivelin

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
17
Jeremy Low

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)
15
burkesquires

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.

12
M.Z

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     
9
Myeongsik Joo

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)
3
multigoodverse

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)   ], [])  ]
0
Roko Mijic

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']
0
tweet