Ich habe folgendes DataFrame
( df
):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
Ich füge weitere Spalten durch Zuweisung hinzu:
df['mean'] = df.mean(1)
Wie kann ich die Spalte mean
nach vorne verschieben, dh als erste Spalte festlegen, wobei die Reihenfolge der anderen Spalten unberührt bleibt?
MultiIndex
.Antworten:
Eine einfache Möglichkeit wäre, den Datenrahmen mit einer Liste der Spalten neu zuzuweisen, die nach Bedarf neu angeordnet werden.
Das haben Sie jetzt:
Ordnen
cols
Sie es nach Belieben neu an. So habe ich das letzte Element an die erste Position verschoben:Ordnen Sie dann den Datenrahmen folgendermaßen neu an:
quelle
cols
istlist
; Es sind sogar Duplikate zulässig (die bei Verwendung im Datenrahmen verworfen werden). Sie denken anIndex
Objekte.Sie könnten auch so etwas tun:
Sie können die Liste der Spalten erhalten mit:
Die Ausgabe erzeugt:
... die dann einfach manuell neu anzuordnen ist, bevor sie in die erste Funktion übernommen wird
quelle
df.columns.tolist()
df = df[['mean1', 0, 1, 2, 3]]
Spaltennamen sind ganze Zahlen in 3.x ✓pd.read_csv()
. Wie kann Ihre Antwort verwendet werden, um die Spaltenreihenfolge zu ändern?Weisen Sie einfach die Spaltennamen in der gewünschten Reihenfolge zu:
Jetzt erscheint vorne die Spalte "Mittelwert":
quelle
<df>.columns
wie Sie es ursprünglich behauptenWie wäre es mit:
http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion
quelle
pandas
? so etwas wiedf.move(0,df.mean)
?df_metadata.insert(0,'Db_name',"raw_data")
(Code nicht relevant für diesen Thread)*** ValueError: cannot insert mean, already exists
In Ihrem Fall,
wird genau das tun, was Sie wollen.
In meinem Fall (allgemeine Form):
quelle
copy=False
aber es sieht so aus, als würdereindex_axis
immer noch eine Kopie erstellt.Sie müssen eine neue Liste Ihrer Spalten in der gewünschten Reihenfolge erstellen und dann
df = df[cols]
die Spalten in dieser neuen Reihenfolge neu anordnen.Sie können auch einen allgemeineren Ansatz verwenden. In diesem Beispiel wird die letzte Spalte (angezeigt durch -1) als erste Spalte eingefügt.
Sie können diesen Ansatz auch verwenden, um Spalten in einer gewünschten Reihenfolge neu anzuordnen, wenn sie im DataFrame vorhanden sind.
quelle
Sie können folgende Lösungen ausprobieren:
Lösung 1:
Lösung 2:
Lösung 3:
Lösung 4:
Lösung 5:
Lösung 6:
Zeitvergleich:
Lösung 1:
Lösung 2 :
Lösung 3 :
Lösung 4 :
Lösung 5 :
Lösung 6 :
quelle
df = df.iloc[:, [1, 2, 3, 0]]
Ab August 2018:
Wenn Ihre Spaltennamen zu lang sind, um sie einzugeben, können Sie die neue Reihenfolge über eine Liste von Ganzzahlen mit den folgenden Positionen angeben:
Daten:
Allgemeines Beispiel:
Und für den speziellen Fall der Frage von OP:
Das Hauptproblem bei diesem Ansatz ist, dass das mehrmalige Aufrufen des gleichen Codes jedes Mal zu unterschiedlichen Ergebnissen führt. Daher muss man vorsichtig sein :)
quelle
Mit dieser Funktion müssen Sie nicht jede Variable in Ihrem Datensatz auflisten, um nur einige davon zu bestellen.
Es werden zwei Argumente benötigt, das erste ist das Dataset, das zweite sind die Spalten im Datensatz, die Sie in den Vordergrund stellen möchten.
In meinem Fall habe ich also einen Datensatz namens Frame mit den Variablen A1, A2, B1, B2, Total und Date. Wenn ich Total nach vorne bringen will, muss ich nur Folgendes tun:
Wenn ich Total und Date nach vorne bringen möchte, dann mache ich:
BEARBEITEN:
Eine andere nützliche Möglichkeit, dies zu verwenden, besteht darin, dass Sie, wenn Sie eine unbekannte Tabelle haben und nach Variablen mit einem bestimmten Begriff suchen, wie VAR1, VAR2, ... Folgendes ausführen können:
quelle
Ich bin selbst auf eine ähnliche Frage gestoßen und wollte nur hinzufügen, worauf ich mich festgelegt habe. Ich mochte die
reindex_axis() method
zum Ändern der Spaltenreihenfolge. Das hat funktioniert:Eine alternative Methode basierend auf dem Kommentar von @Jorge:
Obwohl
reindex_axis
es in Mikro-Benchmarks etwas schneller zu sein scheint alsreindex
, bevorzuge ich Letzteres wegen seiner Direktheit.quelle
Einfach machen,
quelle
order = df.columns.tolist()
df['mean'] = df.mean(1)
df.columns = ['mean'] + order
headers
die zum Erstellen eines Diktats verwendet wurde, das dann zum Erstellen des von mir aufgerufenen DataFrame verwendet wurdedf.reindex(columns=headers)
. Das einzige Problem, auf das ich stieß, war, dass ich bereits aufgerufendf.set_index('some header name', inplace=True)
hatte. Als die Neuindizierung abgeschlossen war, wurde eine weitere Spalte hinzugefügt, die benannt wurde,some header name
da die ursprüngliche Spalte jetzt der Index war. Was die oben angegebene Syntax['mean'] + df.columns
Index(u'meanAddress', u'meanCity', u'meanFirst Name'...
Sie könnten Folgendes tun (Teile aus Amans Antwort ausleihen):
quelle
Geben Sie einfach den Spaltennamen ein, den Sie ändern möchten, und legen Sie den Index für den neuen Speicherort fest.
Für Ihren Fall wäre dies wie folgt:
quelle
Verschieben einer Spalte an eine beliebige Position:
quelle
Ich denke, das ist eine etwas sauberere Lösung:
Diese Lösung ähnelt der Lösung von @JoeHeffer, ist jedoch ein Liner.
Hier entfernen wir die Spalte
"mean"
aus dem Datenrahmen und hängen sie an den Index0
mit demselben Spaltennamen an.quelle
Hier ist eine Möglichkeit, eine vorhandene Spalte zu verschieben, um den vorhandenen Datenrahmen zu ändern.
quelle
Diese Frage wurde beantwortet , bevor aber reindex_axis ist jetzt veraltet , so ich Verwendung vorschlagen würde:
quelle
Wie wäre es mit "T"?
quelle
@clocker: Ihre Lösung war für mich sehr hilfreich, da ich zwei Spalten aus einem Datenrahmen voranstellen wollte, in dem ich die Namen aller Spalten nicht genau kenne, da sie zuvor aus einer Pivot-Anweisung generiert wurden. Wenn Sie sich also in der gleichen Situation befinden: Um Spalten vorzubringen, deren Namen Sie kennen, und sie dann von "allen anderen Spalten" folgen zu lassen, habe ich die folgende allgemeine Lösung gefunden.
quelle
set()
::Ein einfacher Ansatz ist die Verwendung
set()
, insbesondere wenn Sie eine lange Liste von Spalten haben und diese nicht manuell behandeln möchten:quelle
Ich mochte Shoreshs Antwort , die Set-Funktionalität zum Entfernen von Spalten zu verwenden, wenn Sie den Speicherort nicht kennen. Dies funktionierte jedoch nicht für meinen Zweck, da ich die ursprüngliche Spaltenreihenfolge muss (die beliebige Spaltenbezeichnungen hat).
Ich habe dies jedoch mithilfe von IndexedSet aus dem Boltons-Paket zum Laufen gebracht.
Ich musste auch mehrere Spaltenbeschriftungen erneut hinzufügen, sodass ich für einen allgemeineren Fall den folgenden Code verwendete:
Ich hoffe, dies ist nützlich für alle, die diesen Thread nach einer allgemeinen Lösung durchsuchen.
quelle
set
es ziemlich oft für diesen Zweck und musste mich nie mit Bestellungen befassen.Sie können verwenden,
reindex
welche für beide Achsen verwendet werden kann:quelle
Hier ist eine Funktion, um dies für eine beliebige Anzahl von Spalten zu tun.
quelle
Hackiest Methode im Buch
quelle
Ich denke, diese Funktion ist einfacher. Sie müssen nur eine Teilmenge der Spalten am Anfang oder am Ende oder an beiden angeben:
quelle
Ich glaube, @ Amans Antwort ist die beste, wenn Sie den Ort der anderen Spalte kennen.
Wenn Sie den Standort von nicht kennen
mean
, aber nur seinen Namen haben, können Sie nicht direkt darauf zurückgreifencols = cols[-1:] + cols[:-1]
. Das Folgende ist das nächstbeste, was ich mir vorstellen kann:quelle
Nur umdrehen hilft oft.
Oder mischen Sie einfach für einen Blick.
quelle
Die meisten Antworten wurden nicht ausreichend verallgemeinert, und die Methode pandas reindex_axis ist etwas langwierig. Daher biete ich eine einfache Funktion an, um eine beliebige Anzahl von Spalten mithilfe eines Wörterbuchs an eine beliebige Position zu verschieben, wobei key = Spaltenname und value = position zum Verschieben. Wenn Ihr Datenrahmen groß ist, übergeben Sie True 'big_data', und die Funktion gibt die Liste der geordneten Spalten zurück. Mit dieser Liste können Sie Ihre Daten aufteilen.
quelle
Ich habe einen sehr speziellen Anwendungsfall für die Neuordnung von Spaltennamen in Pandas. Manchmal erstelle ich eine neue Spalte in einem Datenrahmen, die auf einer vorhandenen Spalte basiert. Standardmäßig fügen Pandas meine neue Spalte am Ende ein, aber ich möchte, dass die neue Spalte neben der vorhandenen Spalte eingefügt wird, von der sie abgeleitet ist.
quelle
Eine ziemlich einfache Lösung, die für mich funktioniert hat, ist die Verwendung von .reindex für df.columns:
quelle