Comment obtenir les en-têtes de colonne de Pandas DataFrame sous forme de liste

Aliaksei Yursha 25 juin 2020
Comment obtenir les en-têtes de colonne de Pandas DataFrame sous forme de liste

Pandas est un paquet open-source pour l’analyse de données en Python.
pandas.DataFrame est la principale structure de données de Pandas.
C’est une structure de données tabulaires bidimensionnelles avec des axes étiquetés (lignes et colonnes).

Un cas d’utilisation très répandu est d’obtenir une liste d’en-têtes de colonnes à partir d’un objet DataFrame.

Nous allons réutiliser l’objet DataFrame, que nous définissons ci-dessous, dans tous les autres exemples de code de ce tutoriel.

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

Une façon de mettre la main sur les noms de colonnes de DataFrame est d’itérer sur un objet DataFrame lui-même.
L’itérateur DataFrame retourne les noms de colonnes dans l’ordre de la définition.

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

Quand il est nécessaire de convertir un itérateur en liste, vous pouvez appeler la fonction list intégrée de Python.

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

Cependant, la performance de cette méthode est lente.

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

Nous pouvons aussi aller plus loin dans un objet DataFrame pour accéder à ses colonnes à partir d’une propriété DataFrame.columns.

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

Sinon, nous pouvons utiliser la fonction DataFrame.columns.tolist() pour obtenir la même chose.

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

La performance de ces deux méthodes n’est pas bien meilleure.

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

Les choses changent beaucoup en allant encore plus loin dans la propriété DataFrame.columns.values.
De même, comme avec l’objet DataFrame et la propriété DataFrame.columns, nous pouvons l’utiliser pour obtenir une séquence de noms de colonnes DataFrame.

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

Les performances de cette approche sont 5 à 6 fois meilleures que celles des méthodes précédentes.

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

Cependant, le meilleur temps d’exécution peut être obtenu si nous utilisons la méthode intégrée DataFrame.columns.values.tolist().

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

Comme nous pouvons le voir, la performance de cette approche est plus de dix fois meilleure que si nous avions itéré directement sur l’objet DataFrame.
La plupart des ingénieurs seront curieux de connaître les raisons d’une telle différence de performance.

La réponse se cache dans le type de données de la propriété DataFrame.columns.values.
Il s’agit d’un tableau NumPy.
NumPy est un paquet Python pour le calcul scientifique, et les mainteneurs l’optimisent fortement pour la performance.

Pandas est construit sur NumPy et fournit des abstractions pratiques de haut niveau.
Ainsi, effectuer des opérations directes sur des structures de données NumPy de niveau inférieur sera presque toujours plus rapide que d’effectuer des opérations similaires sur des structures de données Pandas de niveau supérieur.

Article connexe - Pandas DataFrame

Article connexe - Pandas DataFrame Column