Wie man Pandas DataFrame-Spaltenüberschriften als Liste erhält

Aliaksei Yursha 25 Juni 2020
Wie man Pandas DataFrame-Spaltenüberschriften als Liste erhält

Pandas ist ein Open-Source-Paket zur Datenanalyse in Python.
pandas.DataFrame ist die primäre Datenstruktur von Pandas.
Es ist eine zweidimensionale tabellarische Datenstruktur mit beschrifteten Achsen (Zeilen und Spalten).

Ein weit verbreiteter Anwendungsfall ist es, eine Liste von Spaltenüberschriften aus einem DataFrame Objekt zu erhalten.

Wir werden das DataFrame Objekt, das wir unten definieren, in allen anderen Code-Beispielen dieses Tutorials wiederverwenden.

>>> import pandas
>>> cities = {
...   'name': ['New York', 'Los Angeles', 'Chicago'],
...   'population': [8601186, 4057841, 2679044],
...   'state': ['NY', 'CA', 'IL'],
... }
>>> data_frame = pandas.DataFrame(cities)

Ein Weg, um an die Spaltennamen von DataFrame zu gelangen, ist die Iteration über ein DataFrame Objekt selbst.
Der DataFrame Iterator gibt die Spaltennamen in der Reihenfolge der Definition zurück.

>>> for column in data_frame:
...   print(column)
...
name
population
state

Wenn die Notwendigkeit besteht, eine Iteration in eine Liste zu konvertieren, können Sie Pythons eingebaute list Funktion darauf anwenden.

>>> list(data_frame)
['name', 'population', 'state']

Allerdings ist die Performance dieser Methode träge.

>>> from timeit import timeit
>>> timeit(lambda: list(data_frame))
7.818843764999997

Wir können auch tiefer in ein DataFrame-Objekt eindringen, um von einer DataFrame.columns-Eigenschaft auf seine Spalten zuzugreifen.

>>> list(data_frame.columns)
['name', 'population', 'state']

Andernfalls können wir die DataFrame.columns.tolist() Funktion benutzen, um das gleiche zu erreichen.

>>> data_frame.columns.tolist()
['name', 'population', 'state']

Die Performance dieser beiden Methoden ist nicht viel besser.

>>> timeit(lambda: list(data_frame.columns))
7.143133517000024
>>> timeit(lambda: data_frame.columns.tolist())
6.064925153999866

Die Dinge ändern sich viel, wenn man noch weiter in die DataFrame.columns.values-Eigenschaft hineingeht.
Ähnlich wie beim DataFrame-Objekt und der DataFrame.columns-Eigenschaft, können wir sie benutzen, um eine Sequenz von DataFrame-Spaltennamen zu erhalten.

>>> list(data_frame.columns.values)
['name', 'population', 'state']

Die Performance dieses Ansatzes ist 5 bis 6 mal besser als die der vorherigen Methoden.

>>> timeit(lambda: list(data_frame.columns.values))
1.301724927000123

Trotzdem kann die beste Laufzeit erreicht werden, wenn wir die eingebaute DataFrame.columns.values.tolist() Methode verwenden.

>>> data_frame.columns.values.tolist()
['name', 'population', 'state']
>>> timeit(lambda: data_frame.columns.values.tolist())
0.6860591469999235

Wie wir sehen können, ist die Performance dieses Ansatzes mehr als zehnmal besser, als wenn wir direkt über das DataFrame-Objekt iterieren würden.
Die meisten Ingenieure werden neugierig auf die Gründe für eine solche Diskrepanz in der Leistung sein.

Die Antwort versteckt sich im Datentyp der DataFrame.columns.values Eigenschaft.
Es ist ein NumPy Array.
NumPy ist ein Python-Paket für wissenschaftliches Rechnen, und die Maintainer optimieren es in hohem Maße für die Performance.

Pandas ist auf NumPy aufgebaut und bietet bequeme Abstraktionen auf hoher Ebene.
Daher wird die Ausführung direkter Operationen auf NumPy-Datenstrukturen auf niedrigerer Ebene fast immer schneller sein als die Ausführung ähnlicher Operationen auf Pandas-Datenstrukturen auf höherer Ebene.

Verwandter Artikel - Pandas DataFrame

Verwandter Artikel - Pandas DataFrame Column