Cómo obtener las cabeceras de columna de Pandas DataFrame como una lista

Aliaksei Yursha 25 junio 2020
Cómo obtener las cabeceras de columna de Pandas DataFrame como una lista

Pandas es un paquete de código abierto para el análisis de datos en Python.
pandas.DataFrame es la estructura de datos primaria de Pandas.
Es una estructura de datos tabular bidimensional con ejes etiquetados (filas y columnas).

Un caso de uso generalizado es obtener una lista de cabeceras de columna de un objeto DataFrame.

Reutilizaremos el objeto DataFrame, que definimos a continuación, en todos los demás ejemplos de código de este tutorial.

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

Una forma de obtener los nombres de las columnas del DataFrame es iterar sobre el propio objeto DataFrame.
El iterador DataFrame devuelve los nombres de columna en el orden de su definición.

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

Cuando es necesario convertir un iterable en una lista, puedes llamar a la función list incorporada en Python.

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

Sin embargo, el rendimiento de este método es lento.

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

También podemos profundizar en un objeto DataFrame para acceder a sus columnas desde una propiedad DataFrame.columns.

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

De lo contrario, podemos usar la función DataFrame.columns.tolist() para conseguir lo mismo.

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

El rendimiento de ambos métodos no es mucho mejor.

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

Las cosas cambian mucho cuando se pasa a la propiedad DataFrame.columns.values.
De manera similar, como con el objeto DataFrame y la propiedad DataFrame.columns, podemos usarla para obtener una secuencia de nombres de columnas DataFrame.

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

El rendimiento de este enfoque es de 5 a 6 veces mejor cuando se compara con los métodos anteriores.

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

Aún así, el mejor tiempo de ejecución se puede conseguir si usamos el método incorporado DataFrame.columns.values.tolist().

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

Como podemos ver, el rendimiento de esta aproximación es más de diez veces mejor que si hubiéramos iterado directamente sobre el objeto DataFrame.
La mayoría de los ingenieros tendrán curiosidad por saber las razones de esta discrepancia en el rendimiento.

La respuesta se esconde en el tipo de datos de la propiedad DataFrame.columns.values.
Es un array NumPy.
NumPy es un paquete Python para computación científica, y los mantenedores lo optimizan altamente para el rendimiento.

Pandas se construye sobre NumPy y proporciona convenientes abstracciones de alto nivel.
Por lo tanto, realizar operaciones directas en estructuras de datos NumPy de nivel inferior será casi siempre más rápido que realizar operaciones similares en estructuras de datos de nivel superior de Pandas.

Artículo relacionado - Pandas DataFrame

Artículo relacionado - Pandas DataFrame Column