Quiero obtener una lista de los encabezados de columna de un DataFrame de pandas. El DataFrame vendrá de la entrada del usuario, así que no sabré cuántas columnas habrá o cómo se llamarán.
Por ejemplo, si me dan un DataFrame como este:
>>> 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
Me gustaría obtener una lista como esta:
>>> header_list
['y', 'gdp', 'cap']
columns
como atributo?df.column_names()
. ¿Esta respuesta sigue siendo correcta o está desactualizada?Hay un método integrado que es el más eficaz:
.columns
devuelve un índice,.columns.values
devuelve una matriz y esto tiene una función auxiliar.tolist
para devolver una lista.Si el rendimiento no es tan importante para usted, los
Index
objetos definen un.tolist()
método al que puede llamar directamente:La diferencia en el rendimiento es obvia:
Para los que odian a escribir, sólo puede llamar
list
adf
, como así:fuente
DataFrame
iterable no ha cambiado desde el primer día: pandas.pydata.org/pandas-docs/stable/basics.html#iteration . El iterable devuelto por un DataFrame siempre ha sido las columnas, por lofor col in df:
que siempre debe comportarse de la misma manera a menos que los desarrolladores tengan una fusión, por lo quelist(df)
es y debería ser un método válido. Tenga en cuenta quedf.keys()
está llamando a la implementación interna de la estructura de tipo dict que devuelve las claves que son las columnas. Los votos negativos inexplicables son el daño colateral que se espera en SO, así que no se preocupecolumns
atributo. Hace una hora leí acerca de la Ley de Deméter que promovía que la persona que llama no debería depender de navegar por el modelo de objeto interno.list(df)
hace conversión de tipo explícito. Efecto secundario notable: el tiempo de ejecución y el consumo de memoria aumentan con eldf.keys()
método de tamaño de trama de datos es parte de la naturaleza dict-like de aDataFrame
. Hecho notable: el tiempo de ejecucióndf.keys()
es bastante constante independientemente del tamaño del marco de datos, parte de la responsabilidad de los desarrolladores de pandas.Hice algunas pruebas rápidas, y quizás como era de esperar, la versión incorporada que usa
dataframe.columns.values.tolist()
es la más rápida:(Aunque todavía me gusta mucho
list(dataframe)
, ¡así que gracias EdChum!)fuente
Se vuelve aún más simple (por pandas 0.16.0):
le dará los nombres de las columnas en una buena lista.
fuente
Para enumerar las columnas de un marco de datos mientras está en modo depurador, use una comprensión de lista:
Por cierto, puede obtener una lista ordenada simplemente usando
sorted
:fuente
list(df)
Funcionaría solo con marcos de datos de aumento automático? ¿O funciona para todos los marcos de datos?[c for c in df]
.Sorprendido, no he visto esto publicado hasta ahora, así que lo dejaré aquí.
Desempaquetado Iterable Extendido (python3.5 +):
[*df]
y AmigosLas generalizaciones de desempaque (PEP 448) se han introducido con Python 3.5. Entonces, las siguientes operaciones son todas posibles.
Si quieres un
list
...O, si quieres un
set
,O, si quieres un
tuple
,O, si desea almacenar el resultado en algún lugar,
... si eres el tipo de persona que convierte el café en sonidos de mecanografía, bueno, esto consumirá tu café de manera más eficiente;)
Verificación visual
Como he visto esto discutido en otras respuestas, puede utilizar desempaquetar iterable (sin necesidad de bucles explícitos).
Crítica de otros métodos
No use un explícito
for
bucle para una operación que se puede hacer en una sola línea (las comprensiones de la lista están bien).A continuación, el uso
sorted(df)
no conserva el orden original de las columnas. Para eso, debes usarlist(df)
en lugar.A continuación,
list(df.columns)
ylist(df.columns.values)
son sugerencias pobres (a partir de la versión actual, v0.24). Ambas matricesIndex
(devueltas dedf.columns
) y NumPy (devueltas pordf.columns.values
) definen.tolist()
método que es más rápido y más idiomático.Por último, la enumeración, es decir,
list(df)
solo debe usarse como una alternativa concisa a los métodos antes mencionados para python <= 3.4 donde el desembalaje extendido no está disponible.fuente
Eso está disponible como
my_dataframe.columns
.fuente
header_list = list(my_dataframe.columns)
df.columns.tolist()
.Es interesante, pero
df.columns.values.tolist()
es casi 3 veces más rápido,df.columns.tolist()
pero pensé que son lo mismo:fuente
.values
devuelve la matriz numpy subyacente, y hacer algo con numpy es casi siempre más rápido que hacer lo mismo con los pandas directamente.Un DataFrame sigue la convención tipo dict de iterar sobre las "claves" de los objetos.
Crear una lista de claves / columnas: método de objeto
to_list()
y forma pitónicaLa iteración básica en un DataFrame devuelve etiquetas de columna
No convierta un DataFrame en una lista, solo para obtener las etiquetas de columna. No deje de pensar mientras busca ejemplos de códigos convenientes.
fuente
df.columns
es mucho más rápido quedf.keys()
. No estoy seguro de por qué tienen una función y un atributo para la misma cosa (bueno, no es la primera vez que veo 10 formas diferentes de hacer algo en pandas).En el cuaderno
Para la exploración de datos en el cuaderno de IPython, mi forma preferida es esta:
Lo que producirá una lista ordenada alfabéticamente fácil de leer.
En un repositorio de código
En el código me parece más explícito hacer
Porque le dice a otros que leen tu código lo que estás haciendo.
fuente
sorted(df)
cambia el orden Usar con precaución.fuente
como respondió Simeon Visser ... podrías hacer
o
Pero creo que el mejor punto es:
Es explícito, al mismo tiempo, no innecesariamente largo.
fuente
list
no tiene mérito a menos que lo llamedf
directamente (por ejemplo, concisión). Acceder al.columns
atributo devuelve unIndex
objeto que tiene untolist()
método definido y llamarlo es más idiomático que enumerar elIndex
. Mezclar expresiones idiomáticas solo por completar no es una gran idea. Lo mismo ocurre con la lista de la matriz que obtiene.values
.Para una verificación visual rápida, ordenada, intente esto:
fuente
Esto nos da los nombres de las columnas en una lista:
También se puede usar otra función llamada tolist ():
fuente
Siento que la pregunta merece una explicación adicional.
Como señaló @fixxxer, la respuesta depende de la versión de pandas que esté utilizando en su proyecto. Que puedes conseguir con
pd.__version__
comando.Si por alguna razón como yo (en Debian Jessica uso 0.14.1) usando una versión anterior de pandas que no sea 0.16.0, entonces necesita usar:
df.keys().tolist()
porque no haydf.columns
método implementado.La ventaja de este método de teclas es que funciona incluso en la versión más reciente de los pandas, por lo que es más universal.
fuente
fuente
[n for n in dataframe.columns]
Aunque la solución que se proporcionó anteriormente es buena. También esperaría que algo como frame.column_names () sea una función en pandas, pero como no lo es, tal vez sería bueno usar la siguiente sintaxis. De alguna manera, conserva la sensación de que está utilizando los pandas de manera adecuada llamando a la función "tolist": frame.columns.tolist ()
fuente
Si el DataFrame tiene un índice o MultiIndex y desea incluirlos también como nombres de columna:
Evita llamar a reset_index () que tiene un impacto de rendimiento innecesario para una operación tan simple.
Me he encontrado con que necesito esto más a menudo porque estoy transfiriendo datos de bases de datos donde el índice del marco de datos se asigna a una clave primaria / única, pero en realidad es solo otra "columna" para mí. Probablemente tendría sentido que los pandas tengan un método incorporado para algo como esto (totalmente posible, me lo he perdido).
fuente
Esta solución enumera todas las columnas de su objeto my_dataframe:
fuente