Ich möchte eine Liste der Spaltenüberschriften von einem Pandas DataFrame erhalten. Der DataFrame wird von Benutzereingaben stammen, sodass ich nicht weiß, wie viele Spalten vorhanden sein werden oder wie sie aufgerufen werden.
Zum Beispiel, wenn ich einen DataFrame wie diesen bekomme:
>>> my_dataframe
y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
Ich würde gerne eine Liste wie diese bekommen:
>>> header_list
['y', 'gdp', 'cap']
columns
Attribut?df.column_names()
. Ist diese Antwort immer noch richtig oder veraltet?Es gibt eine eingebaute Methode, die am leistungsfähigsten ist:
.columns
Gibt einen Index zurück,.columns.values
gibt ein Array zurück und verfügt über eine Hilfsfunktion.tolist
zum Zurückgeben einer Liste.Wenn Ihnen die Leistung nicht so wichtig ist,
Index
definieren Objekte eine.tolist()
Methode, die Sie direkt aufrufen können:Der Leistungsunterschied ist offensichtlich:
Für diejenigen , die Typisierung hassen, können Sie einfach anrufen
list
aufdf
, wie so:quelle
DataFrame
Iterable hat sich seit dem ersten Tag nicht geändert: pandas.pydata.org/pandas-docs/stable/basics.html#iteration . Das von einem DataFrame zurückgegebene iterable war immer die Spalte, daherfor col in df:
sollte sich das immer gleich verhalten, es sei denn, die Entwickler haben eine Kernschmelze, solist(df)
ist dies und sollte immer noch eine gültige Methode sein. Beachten Sie, dassdf.keys()
die interne Implementierung der diktartigen Struktur aufgerufen wird, wobei die Schlüssel zurückgegeben werden, die die Spalten sind. Unerklärliche Abstimmungen sind der Kollateralschaden, der auf SO zu erwarten ist. Machen Sie sich also keine Sorgencolumns
Attributs. Vor einer Stunde habe ich über das Gesetz von Demeter gelesen, das besagt, dass der Anrufer nicht von der Navigation im internen Objektmodell abhängen sollte.list(df)
führt eine explizite Typkonvertierung durch. Bemerkenswerter Nebeneffekt: Die Erhöhung der Ausführungszeit und des Speicherverbrauchs mit der Datenrahmengrößenmethodedf.keys()
ist Teil der diktierten Natur von aDataFrame
. Bemerkenswerte Tatsache: Die Ausführungszeit fürdf.keys()
ist unabhängig von der Größe des Datenrahmens ziemlich konstant - Teil der Verantwortung der Pandas-Entwickler.Habe einige schnelle Tests durchgeführt, und es ist vielleicht nicht überraschend, dass die integrierte Version
dataframe.columns.values.tolist()
die schnellste ist:(Ich mag das immer noch sehr
list(dataframe)
, also danke EdChum!)quelle
Es wird noch einfacher (von Pandas 0.16.0):
gibt Ihnen die Spaltennamen in einer schönen Liste.
quelle
Verwenden Sie ein Listenverständnis, um die Spalten eines Datenrahmens im Debugger-Modus aufzulisten:
Übrigens können Sie eine sortierte Liste erhalten, indem Sie einfach Folgendes verwenden
sorted
:quelle
list(df)
nur mit Autoincrement-Datenrahmen funktionieren? Oder funktioniert es für alle Datenrahmen?[c for c in df]
.Überrascht habe ich das bisher noch nicht gesehen, also lasse ich es einfach hier.
Erweitertes iterierbares Entpacken (python3.5 +):
[*df]
und FreundeDas Entpacken von Verallgemeinerungen (PEP 448) wurde mit Python 3.5 eingeführt. Die folgenden Operationen sind also alle möglich.
Wenn Sie eine
list
....Oder, wenn Sie eine wollen
set
,Oder, wenn Sie eine wollen
tuple
,Oder wenn Sie das Ergebnis irgendwo speichern möchten,
... wenn Sie die Art von Person sind, die Kaffee in Tippgeräusche umwandelt, wird dies Ihren Kaffee effizienter konsumieren;)
Visuelle Überprüfung
Da ich dies in anderen Antworten gesehen habe, können Sie iterierbares Entpacken verwenden (keine expliziten Schleifen erforderlich).
Kritik anderer Methoden
Verwenden Sie keine explizite
for
Schleife für eine Operation, die in einer einzelnen Zeile ausgeführt werden kann (Listenverständnisse sind in Ordnung).Bei Verwendung von
sorted(df)
wird die ursprüngliche Reihenfolge der Spalten nicht beibehalten . Dafür sollten Sielist(df)
stattdessen verwenden.Weiter
list(df.columns)
undlist(df.columns.values)
sind schlechte Vorschläge (ab der aktuellen Version, v0.24). SowohlIndex
(zurückgegeben vondf.columns
) als auch NumPy-Arrays (zurückgegeben vondf.columns.values
) definieren eine.tolist()
Methode, die schneller und idiomatischer ist.Schließlich sollte die Auflistung, dh,
list(df)
nur als prägnante Alternative zu den oben genannten Methoden für Python <= 3.4 verwendet werden, bei denen kein erweitertes Entpacken verfügbar ist.quelle
Das ist verfügbar als
my_dataframe.columns
.quelle
header_list = list(my_dataframe.columns)
df.columns.tolist()
.Es ist interessant, aber
df.columns.values.tolist()
dann fast dreimal schneller,df.columns.tolist()
aber ich dachte, dass sie gleich sind:quelle
.values
das zugrunde liegende Numpy-Array zurückgegeben wird und es fast immer schneller ist, etwas mit Numpy zu tun, als dasselbe mit Pandas direkt zu tun.Ein DataFrame folgt der diktartigen Konvention, über die „Schlüssel“ der Objekte zu iterieren.
Erstellen Sie eine Liste von Schlüsseln / Spalten - Objektmethode
to_list()
und pythonische MethodeDie grundlegende Iteration in einem DataFrame gibt Spaltenbeschriftungen zurück
Konvertieren Sie einen DataFrame nicht in eine Liste, nur um die Spaltenbeschriftungen zu erhalten. Hören Sie nicht auf zu denken, während Sie nach praktischen Codebeispielen suchen.
quelle
df.columns
es viel schneller ist alsdf.keys()
. Ich bin mir nicht sicher, warum sie sowohl eine Funktion als auch ein Attribut für dasselbe haben (nun, es ist nicht das erste Mal, dass ich 10 verschiedene Möglichkeiten gesehen habe, etwas in Pandas zu tun).Im Notizbuch
Für die Datenexploration im IPython-Notizbuch bevorzuge ich Folgendes:
Dadurch wird eine einfach zu lesende alphabetisch geordnete Liste erstellt.
In einem Code-Repository
Im Code finde ich es expliziter zu tun
Weil es anderen, die Ihren Code lesen, sagt, was Sie tun.
quelle
sorted(df)
ändert die Reihenfolge. Mit Vorsicht verwenden.quelle
wie von Simeon Visser beantwortet ... könnten Sie tun
oder
Aber ich denke am meisten ist der Sweet Spot:
Es ist explizit, gleichzeitig nicht unnötig lang.
quelle
list
Anrufen hat keinen Wert, es sei denn, Sie rufen esdf
direkt an (z. B. Prägnanz). Der Zugriff auf das.columns
Attribut gibt einIndex
Objekt zurück, für das einetolist()
Methode definiert ist, und der Aufruf ist idiomatischer als das Auflisten desIndex
. Das Mischen von Redewendungen nur der Vollständigkeit halber ist keine gute Idee. Gleiches gilt für die Auflistung des Arrays, von dem Sie erhalten.values
.Versuchen Sie Folgendes, um eine schnelle, saubere und visuelle Überprüfung zu erhalten:
quelle
Dies gibt uns die Namen der Spalten in einer Liste:
Eine andere Funktion namens tolist () kann ebenfalls verwendet werden:
quelle
Ich bin der Meinung, dass die Frage eine zusätzliche Erklärung verdient.
Wie @fixxxer feststellte, hängt die Antwort von der Pandas-Version ab, die Sie in Ihrem Projekt verwenden. Was Sie mit
pd.__version__
Befehl bekommen können .Wenn Sie aus irgendeinem Grund wie ich (auf Debian Jessie verwende ich 0.14.1) eine ältere Version von Pandas als 0.16.0 verwenden, müssen Sie Folgendes verwenden:
df.keys().tolist()
weil noch keinedf.columns
Methode implementiert ist.Der Vorteil dieser Schlüsselmethode ist, dass sie auch in neueren Versionen von Pandas funktioniert und somit universeller ist.
quelle
quelle
[n for n in dataframe.columns]
Auch wenn die oben angegebene Lösung nett ist. Ich würde auch erwarten, dass etwas wie frame.column_names () eine Funktion in Pandas ist, aber da dies nicht der Fall ist, wäre es vielleicht schön, die folgende Syntax zu verwenden. Es bewahrt irgendwie das Gefühl, dass Sie Pandas richtig verwenden, indem Sie die Funktion "tolist" aufrufen: frame.columns.tolist ()
quelle
Wenn der DataFrame zufällig einen Index oder MultiIndex hat und Sie möchten, dass diese auch als Spaltennamen enthalten sind:
Es wird vermieden, reset_index () aufzurufen, was für eine so einfache Operation einen unnötigen Leistungseinbruch zur Folge hat.
Ich brauche dies häufiger, weil ich Daten aus Datenbanken pendle, in denen der Datenrahmenindex einem Primär- / eindeutigen Schlüssel zugeordnet ist, aber für mich eigentlich nur eine weitere "Spalte" ist. Für Pandas wäre es wahrscheinlich sinnvoll, eine eingebaute Methode für so etwas zu haben (möglicherweise habe ich sie verpasst).
quelle
Diese Lösung listet alle Spalten Ihres Objekts my_dataframe auf:
quelle