Quiero obtener una lista de los encabezados de columna de una pandas DataFrame. El DataFrame vendrá de la entrada de usuario, así que no voy a saber cuántas columnas habrá o lo que se llama.

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']
  • my_dataframe.columnas.tolist()
  • df.las columnas de las obras en el último de los pandas versión.
  • Tenga en cuenta que dataframe[nombre_columna].to_numpy() es el método sugerido para obtener los valores de una columna como de los pandas 0.24.1
  • Solo dígito para el recuento de caracteres soluciones se pueden encontrar en esta respuesta que utiliza extendido iterable desembalaje.
  • Intente esto: list(my_dataframe.keys())
InformationsquelleAutor natsuki_2002 | 2013-10-20

18 Comentarios

  1. 1457

    Usted puede obtener los valores como una lista haciendo:

    list(my_dataframe.columns.values)

    También se puede utilizar simplemente: (como se muestra en la Ed Compañero de respuesta):

    list(my_dataframe)
    • ¿Por qué este doc no tiene columns como un atributo?
    • No estoy seguro, puede que tenga que ver con la manera en que generan de forma automática su documentación. Se menciona en otros lugares, sin embargo: pandas.pydata.org/pandas-docs/stable/…
    • Habría que esperar algo como df.column_names(). Es esta respuesta aún a la derecha o es obsoleta?
    • hay varias otras maneras de hacerlo (ver otras respuestas en esta página), pero que yo sepa no hay un método en el dataframe directamente para producir la lista.
    • Es importante destacar que este conserva el orden de las columnas.
    • He intentado utilizar esta con unittest assertListEqual para comprobar los encabezados en un df compara una lista de espera, y me dice que no es una lista, sino más bien una secuencia, se ve como array(['colBoolean','colTinyint', 'colSmallnt', ...], dtype=object)
    • df.keys().tolist() es más universal, porque también funciona para las versiones anteriores de pandas de 0.16.0
    • Aunque la solución anterior es agradable. Yo también esperaría algo como marco.column_names() sea una función de los pandas, pero ya no lo es, tal vez sería bueno utilizar la siguiente sintaxis. De alguna manera, se conserva la sensación de que usted está usando pandas de una manera adecuada, llamando a la «tolist» función: marco.columnas.tolist()
    • Tenga en cuenta que dataframe[nombre_columna].to_numpy() es el método sugerido para obtener los valores de una columna como de los pandas 0.24.1
    • Esta primera opción es terrible, como de la versión actual de pandas – v0.24) porque es la mezcla de expresiones idiomáticas. Si usted va a través de la dificultad para acceder a la colección de la matriz, por favor, utilice el .tolist() método en su lugar, es más rápido y más idiomática.

  2. 356

    Hay un método integrado que es la más eficiente:

    my_dataframe.columns.values.tolist()

    .columns devuelve un Índice, .columns.values devuelve una matriz y esta tiene una función auxiliar .tolist para devolver una lista.

    Si el rendimiento no es tan importante para usted, Index objetos de definir un .tolist() método que usted puede llamar directamente:

    my_dataframe.columns.tolist()

    La diferencia en el rendimiento es obvia:

    %timeit df.columns.tolist()
    16.7 µs ± 317 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    
    %timeit df.columns.values.tolist()
    1.24 µs ± 12.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

    Para aquellos que odian escribir, usted puede llamar list en df, así como:

    list(df)
    • No voto, pero quiero explicar: no dependen de los detalles de implementación, el uso de «interfaz pública» de DataFrame. Pensar en la belleza de la df.las teclas()
    • la aplicación de la DataFrame iterable no ha cambiado desde el día uno: pandas.pydata.org/pandas-docs/stable/basics.html#iteration. El iterable de regresar de un DataFrame siempre ha sido el de las columnas de hacerlo for col in df: deben siempre se comportan de la misma, a menos que los desarrolladores tienen una crisis tan list(df) es y debe seguir siendo un método válido. Tenga en cuenta que df.keys() está llamando a la implementación interna de la dict-como la estructura de la devolución de las llaves, que son las columnas. Inexplicable downvotes es el daño colateral se espera que en TAN así que no te preocupes
    • Me estaba refiriendo a los detalles de implementación de columns atributo. Hace una hora que he leído acerca de la Ley de Demeter promover que la persona que llama no debe depender de navegar por el interior del modelo de objetos. list(df) hace explícito el tipo de conversión. Notable efecto secundario: el tiempo de ejecución y consumo de memoria aumentar con el dataframe tamaño df.keys() método es parte de la dict-como la naturaleza de un DataFrame. Hecho destacable: el tiempo de ejecución para df.keys() es bastante constante, independientemente de dataframe tamaño – parte de la responsabilidad de los pandas desarrolladores.
    • Que puedo añadir a mi respuesta y de crédito que ver como nadie lo ha incluido este
    • Puedo ver el valor de respuesta, así como en los comentarios – no hay necesidad de cambiar nada.
    • es df.columns.tolist() la misma como df.columns.values.tolist()? llamar .values decae a numpy que por esta razón era más rápido originalmente

  3. 79

    Hizo algunas pruebas rápidas, y tal como era de esperar la versión integrada del uso de dataframe.columns.values.tolist() es el más rápido:

    In [1]: %timeit [column for column in df]
    1000 loops, best of 3: 81.6 µs per loop
    
    In [2]: %timeit df.columns.values.tolist()
    10000 loops, best of 3: 16.1 µs per loop
    
    In [3]: %timeit list(df)
    10000 loops, best of 3: 44.9 µs per loop
    
    In [4]: % timeit list(df.columns.values)
    10000 loops, best of 3: 38.4 µs per loop

    (Todavía me gusta mucho el list(dataframe) aunque, por lo que gracias EdChum!)

  4. 43

    Su pone aún más simple (por pandas 0.16.0) :

    df.columns.tolist()

    le dará los nombres de columna en una lista de niza.

  5. 33
    >>> list(my_dataframe)
    ['y', 'gdp', 'cap']

    A la lista de las columnas de un dataframe mientras que en el depurador modo, el uso de una lista de comprensión:

    >>> [c for c in my_dataframe]
    ['y', 'gdp', 'cap']

    Por el camino, usted puede obtener una lista ordenada utilizando simplemente sorted:

    >>> sorted(my_dataframe)
    ['cap', 'gdp', 'y']
    • Tendría que list(df) trabajar sólo con autoincrement dataframes? O funciona para todos los dataframes?
    • Debería funcionar para todos. Cuando usted está en el depurador, sin embargo, es necesario utilizar una lista de comprensión [c for c in df].
  6. 24

    Que está disponible como my_dataframe.columns.

    • Y explícitamente como una lista header_list = list(my_dataframe.columns)
    • ^ O, mejor aún: df.columns.tolist().
  7. 18

    Es muy interesante, pero df.columns.values.tolist() es casi 3 veces más rápido, a continuación, df.columns.tolist() pero he pensado que son la misma:

    In [97]: %timeit df.columns.values.tolist()
    100000 loops, best of 3: 2.97 µs per loop
    
    In [98]: %timeit df.columns.tolist()
    10000 loops, best of 3: 9.67 µs per loop
    • Los tiempos ya han sido cubiertos en esta respuesta. La razón de la discrepancia es porque .values devuelve el subyacente numpy matriz, y hacer algo con numpy es casi siempre más rápido que hacer lo mismo con los pandas directamente.
  8. 18

    Sorprendido de que yo no he visto esta publicado hasta el momento, así que solo voy a dejar esto aquí.

    Extendido Iterable Desembalaje (python3.5+): [*df] y Amigos

    Desembalaje de las generalizaciones (PEP 448) se han introducido con Python 3.5. Así, las siguientes operaciones son posibles.

    df = pd.DataFrame('x', columns=['A', 'B', 'C'], index=range(5))
    df
    
       A  B  C
    0  x  x  x
    1  x  x  x
    2  x  x  x
    3  x  x  x
    4  x  x  x 

    Si quieres un list….

    [*df]
    # ['A', 'B', 'C']

    O, si quieres un set,

    {*df}
    # {'A', 'B', 'C'}

    O, si quieres un tuple,

    *df,  # Please note the trailing comma
    # ('A', 'B', 'C')

    O, si desea almacenar el resultado en algún lugar,

    *cols, = df  # A wild comma appears, again
    cols
    # ['A', 'B', 'C']

    … si eres el tipo de persona que convierte café para escribir los sonidos, bueno, esto va consumir el café de manera más eficiente 😉

    P. S.: si el rendimiento es importante, usted quiere deshacerse de la
    soluciones anteriores en favor de

    df.columns.to_numpy().tolist()
    # ['A', 'B', 'C']

    Esto es similar a Ed Compañero
    respuesta
    , pero actualizada para
    v0.24 donde .to_numpy(), se prefiere el uso de .values. Ver
    esta respuesta (por mí)
    para obtener más información.

    Comprobación Visual

    Desde que he visto este discutido en otras respuestas, usted puede utilizar iterable desembalaje (no hay necesidad explícita de bucles).

    print(*df)
    A B C
    
    print(*df, sep='\n')
    A
    B
    C

    La crítica de Otros Métodos

    No utilice explícita for bucle para una operación que se puede hacer en una sola línea (Lista de comprensión están bien).

    Próximo, con sorted(df) no conservar el orden original de las columnas. Para eso, debe utilizar list(df) lugar.

    Siguiente, list(df.columns) y list(df.columns.values) son buenos sugerencias (como el de la versión actual, v0.24). Ambos Index (volvió de df.columns) y arrays de NumPy (devuelto por df.columns.values) definir .tolist() método que es más rápido y más idiomática.

    Por último, listification es decir, list(df) sólo debe ser utilizado como un conciso alternativa a los métodos mencionados anteriormente.

    • Super respuesta! ASÍ que debe tener dos versiones de respuestas, una respuesta correcta basada en el OP pregunta y la MAYORÍA de CORRIENTE . Pregunta: Si tengo que recortar los espacios en blanco en los nombres de columna, puedo hacer eso aquí en uno forro?
    • Seguro, usted puede utilizar [*map(str.strip, df)]
  9. 15

    Un DataFrame sigue el dict-como la convención de la iteración sobre las «claves» de los objetos.

    my_dataframe.keys()

    Crear una lista de teclas/columnas – método de objeto to_list() y python el modo

    my_dataframe.keys().to_list()
    list(my_dataframe.keys())

    Básicos de la iteración en un DataFrame devuelve etiquetas de columna

    [column for column in my_dataframe]

    No convertir un DataFrame en una lista, sólo para obtener las etiquetas de columna. No dejar de pensar, mientras busca conveniente ejemplos de código.

    xlarge = pd.DataFrame(np.arange(100000000).reshape(10000,10000))
    list(xlarge) #compute time and memory consumption depend on dataframe size - O(N)
    list(xlarge.keys()) #constant time operation - O(1)
    • Mis pruebas muestran df.columns es mucho más rápido que df.keys(). No sé por qué tienen tanto una función de atributo y para la misma cosa (bueno, no es la primera vez que he visto a 10 maneras diferentes de hacer algo en pandas).
    • La intención de mi respuesta era para mostrar un par de maneras para consultar las etiquetas de columna de un DataFrame y poner de relieve un rendimiento anti-patrón. Sin embargo, me gustan tus comentarios y upvoted su reciente respuesta, ya que aportan valor a partir de un software de punto de vista de ingeniería.
  10. 13

    En el Cuaderno

    Para la exploración de datos en el IPython notebook, mi preferido es este:

    sorted(df)

    Que producirá un fácil leer la lista por orden alfabético.

    En un repositorio de código

    En el código me parece más explícito para hacer

    df.columns

    Porque le dice a los demás de la lectura de su código de lo que están haciendo.

    • sorted(df) cambia el orden. Usar con precaución.
    • Hago mención de esto, sin embargo, «lo Que va a producir un fácil leer la lista por orden alfabético.»
  11. 6
    %%timeit
    final_df.columns.values.tolist()
    948 ns ± 19.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    %%timeit
    list(final_df.columns)
    14.2 µs ± 79.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    %%timeit
    list(final_df.columns.values)
    1.88 µs ± 11.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
    %%timeit
    final_df.columns.tolist()
    12.3 µs ± 27.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
    %%timeit
    list(final_df.head(1).columns)
    163 µs ± 20.6 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
  12. 3

    como contestada por Simeón Visser…que podría hacer

    list(my_dataframe.columns.values) 

    o

    list(my_dataframe) # for less typing.

    Pero creo que la mayoría de la sweet spot es:

    list(my_dataframe.columns)

    Es explícito, al mismo tiempo, no innecesariamente largo.

    • «Es explícito, al mismo tiempo, no innecesariamente largo.» No estoy de acuerdo. Llamar list no tiene ningún valor, a menos que lo están llamando en df directamente (por ejemplo, la concisión). El acceso a la .columns atributo devuelve un Index objeto que tiene un tolist() método definido, y una llamada a la que es más idiomático de listifying la Index. La mezcla de expresiones idiomáticas sólo en aras de la exhaustividad no es una gran idea. Lo mismo va para listifying la matriz que se obtiene de .values.
  13. 3

    Esto nos da los nombres de las columnas en una lista:

    list(my_dataframe.columns)

    Otra función llamada tolist() puede ser usado también:

    my_dataframe.columns.tolist()
    • Esto ya ha sido cubierto en otras respuestas. Su primera solución que también se mezcla idiomática, que no es una gran idea. Ver a mi comment en otra respuesta.
  14. 2

    Me siento pregunta merece una explicación adicional.

    Como @fixxxer señaló, la respuesta depende de los pandas versión que está utilizando en el proyecto.
    Que usted puede conseguir con pd.__version__ comando.

    Si por alguna razón me gusta (en debian jessie yo uso 0.14.1) utilizando la versión anterior de pandas de 0.16.0, entonces usted necesita para usar:

    df.keys().tolist() porque no hay df.columns método implementado aún.

    La ventaja de este método claves es, que funciona incluso en la versión más reciente de los pandas, por lo que es más universal.

    • La estafa de las teclas() es que es una llamada a una función en lugar de un atributo de búsqueda, por lo que siempre va a ser más lento. Por supuesto, con constante de tiempo de accesos, nadie realmente se preocupa acerca de las diferencias como estas, pero creo que vale la pena mencionar que de todos modos; df.columnas es ahora más universalmente aceptado lenguaje para acceder a los encabezados.
  15. 1
    n = []
    for i in my_dataframe.columns:
        n.append(i)
    print n
    • por favor, reemplace con una lista de comprensión.
    • cambiar sus 3 primeras líneas para [n for n in dataframe.columns]
    • ¿Por qué quieres ir a través de todo este problema de una operación que se puede hacer fácilmente en una sola línea?
  16. 0

    Aunque la solución anterior es agradable. Yo también esperaría algo como marco.column_names() sea una función de los pandas, pero ya no lo es, tal vez sería bueno utilizar la siguiente sintaxis. De alguna manera, se conserva la sensación de que usted está usando pandas de una manera adecuada, llamando a la «tolist» función: marco.columnas.tolist()

    frame.columns.tolist() 
    • Ya cubiertas (y golpeado hasta la muerte) en otras respuestas.
  17. -1

    Esta solución muestra todas las columnas de su objeto my_dataframe:

    print(list(my_dataframe))
    • Ya se han tratado en otras respuestas.

Dejar respuesta

Please enter your comment!
Please enter your name here