Come ottenere le intestazioni delle colonne DataFrame Pandas come lista

Aliaksei Yursha 30 marzo 2021
Come ottenere le intestazioni delle colonne DataFrame Pandas come lista

Pandas è un pacchetto open-source per l’analisi dei dati in Python.
pandas.DataFrame è la struttura dati primaria dei pandas.
È una struttura dati tabulare bidimensionale con assi etichettati (righe e colonne).

Un caso d’uso diffuso è quello di ottenere una lista di intestazioni di colonna da un oggetto DataFrame.

Riutilizzeremo l’oggetto DataFrame, che definiamo qui sotto, in tutti gli altri esempi di codice di questo tutorial.

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

Un modo per ottenere i nomi delle colonne di DataFrame è quello di iterare su un oggetto DataFrame stesso.
L’iteratore DataFrame restituisce i nomi delle colonne nell’ordine di definizione.

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

Quando c’è la necessità di convertire un iterabile in una lista, si può chiamare la funzione list integrata di Python su di esso.

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

Tuttavia, la performance di questo metodo è lenta.

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

Si può anche passare più in profondità in un oggetto DataFrame per accedere alle sue colonne da una proprietà DataFrame.columns.

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

Altrimenti, possiamo usare la funzione DataFrame.columns.tolist() per ottenere la stessa cosa.

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

Le prestazioni di entrambi i metodi non sono molto migliori.

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

Le cose cambiano molto quando si passa ancora di più alla proprietà DataFrame.columns.values.
Allo stesso modo, come per l’oggetto DataFrame e la proprietà DataFrame.columns, possiamo usarlo per ottenere una sequenza di nomi di colonne DataFrame.

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

Le prestazioni di questo approccio sono da 5 a 6 volte migliori rispetto ai metodi precedenti.

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

Tuttavia, il miglior tempo di esecuzione può essere raggiunto se usiamo il metodo DataFrame.columns.values.tolist() integrato.

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

Come possiamo vedere, le prestazioni di questo approccio sono più di dieci volte migliori che se avessimo iterato direttamente sull’oggetto DataFrame.
La maggior parte degli ingegneri saranno curiosi di sapere le ragioni di una tale discrepanza nelle prestazioni.

La risposta si nasconde nel tipo di dati della proprietà DataFrame.columns.values.
È un array NumPy.
NumPy è un pacchetto Python per l’informatica scientifica, e i manutentori lo ottimizzano altamente per le prestazioni.

Pandas è costruito sopra NumPy e fornisce comode astrazioni di alto livello.
In questo modo, l’esecuzione di operazioni dirette su strutture dati NumPy di livello inferiore sarà quasi sempre più rapida rispetto all’esecuzione di operazioni simili su strutture dati di livello superiore di Pandas.

Articolo correlato - Pandas DataFrame

Articolo correlato - Pandas DataFrame Column