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.)

Durbachit
quelle

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.]]
A. Kot
quelle
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)
Okroshiashvili
quelle
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
Lala La
quelle
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.

omri_saadon
quelle
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
piRSquared
quelle
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
MaxU
quelle
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']
)
irene
quelle
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
U10-Vorwärts
quelle
-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']]
Sando K.
quelle