Legen Sie die Reihenfolge der Spalten im Pandas-Datenrahmen fest


103

Gibt es eine Möglichkeit, Spalten im Pandas-Datenrahmen basierend auf meinen persönlichen Vorlieben neu anzuordnen (dh nicht alphabetisch oder numerisch sortiert, sondern eher nach bestimmten Konventionen)?

Einfaches Beispiel:

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

produziert dies:

   one thing other thing  second thing
0          1           a           0.1
1          2           e           0.2
2          3           i           1.0
3          4           o           2.0

Aber stattdessen möchte ich Folgendes:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

(Bitte geben Sie eine generische Lösung an, anstatt spezifisch für diesen Fall. Vielen Dank.)

Antworten:


155

Wählen Sie die Reihenfolge einfach selbst aus, indem Sie die Spaltennamen eingeben. Beachten Sie die doppelten Klammern:

frame = frame[['column I want first', 'column I want second'...etc.]]

24
Dies funktioniert nur mit diesem eher kleinen Beispiel. Wenn Sie Daten aus einer anderen Quelle wie einer CSV-Datei oder einer Datenbanktabelle einlesen, können Sie diese Antwort nicht verwenden. Und diese scheinen viel häufiger zu sein. Das OP forderte eine allgemeine Lösung.
chrisfs

83

Sie können dies verwenden:

columnsTitles = ['onething', 'secondthing', 'otherthing']

frame = frame.reindex(columns=columnsTitles)

5
Obwohl die meisten anderen Lösungen prägnanter sind, würde ich diese als die am besten lesbare für jeden betrachten, der nicht 100% vertraut ist pandas.
Dirk

3
Denken Sie jedoch daran, den Rückgabewert einer Variablen pandaszuzuweisen. Dadurch wird die Spaltenreihenfolge nicht direkt geändert (zumindest nicht in Version 0.23`).
Dirk

Danke @Dirk für den Vorschlag
Okroshiashvili

33

Hier ist eine Lösung, die ich sehr oft benutze. Wenn Sie einen großen Datensatz mit Tonnen von Spalten haben, möchten Sie definitiv nicht alle Spalten manuell neu anordnen.

Was Sie tun können und höchstwahrscheinlich möchten, ist, nur die ersten paar Spalten zu bestellen, die Sie häufig verwenden, und alle anderen Spalten nur sich selbst sein zu lassen. Dies ist ein gängiger Ansatz in R.df %>%select(one, two, three, everything())

Sie können also zuerst die Spalten, die Sie bestellen möchten, manuell eingeben und vor allen anderen Spalten in einer Liste positionieren cols_to_order.

Anschließend erstellen Sie eine Liste für neue Spalten, indem Sie den Rest der Spalten kombinieren:

new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())

Danach können Sie die new_columnsals andere vorgeschlagene Lösung verwenden.

import pandas as pd
frame = pd.DataFrame({
    'one thing': [1, 2, 3, 4],
    'other thing': ['a', 'e', 'i', 'o'],
    'more things': ['a', 'e', 'i', 'o'],
    'second thing': [0.1, 0.2, 1, 2],
})

cols_to_order = ['one thing', 'second thing']
new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())
frame = frame[new_columns]

   one thing  second thing other thing more things
0          1           0.1           a           a
1          2           0.2           e           e
2          3           1.0           i           i
3          4           2.0           o           o

1
brillant, perfekt. Vielen Dank, dass ich nicht jeden Spaltennamen oder Index
eingeben muss

Dies ist die allgemeine Antwort und sollte die akzeptierte Antwort sein
CarlosH

26

Sie könnten auch so etwas tun df = df[['x', 'y', 'a', 'b']]

import pandas as pd
frame = pd.DataFrame({'one thing':[1,2,3,4],'second thing':[0.1,0.2,1,2],'other thing':['a','e','i','o']})
frame = frame[['second thing', 'other thing', 'one thing']]
print frame
   second thing other thing  one thing
0           0.1           a          1
1           0.2           e          2
2           1.0           i          3
3           2.0           o          4

Sie können die Liste der Spalten auch abrufen mit:

cols = list(df.columns.values)

Die Ausgabe erzeugt ungefähr Folgendes:

['x', 'y', 'a', 'b']

Welches ist dann einfach manuell neu anzuordnen.


13

Konstruieren Sie es mit einer Liste anstelle eines Wörterbuchs

frame = pd.DataFrame([
        [1, .1, 'a'],
        [2, .2, 'e'],
        [3,  1, 'i'],
        [4,  4, 'o']
    ], columns=['one thing', 'second thing', 'other thing'])

frame

   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           4.0           o

Ich konnte 'Spaltenname' nicht erhalten: Daten funktionieren in einer Liste wie in einem Diktat.
Kim Miller

10

Sie können auch OrderedDict verwenden:

In [183]: from collections import OrderedDict

In [184]: data = OrderedDict()

In [185]: data['one thing'] = [1,2,3,4]

In [186]: data['second thing'] = [0.1,0.2,1,2]

In [187]: data['other thing'] = ['a','e','i','o']

In [188]: frame = pd.DataFrame(data)

In [189]: frame
Out[189]:
   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

6

Fügen Sie den Parameter 'Spalten' hinzu:

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']},
        columns=['one thing', 'second thing', 'other thing']
)

4

Versuchen Sie die Indizierung (Sie möchten also nicht nur eine generische Lösung, sondern auch die Indexreihenfolge genau so, wie Sie es möchten):

l=[0,2,1] # index order
frame=frame[[frame.columns[i] for i in l]]

Jetzt:

print(frame)

Ist:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

-2

Ich finde das am einfachsten und funktionierendsten:

df = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

df = df[['one thing','second thing', 'other thing']]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.