Tengo un dataframe llamado data. ¿Cómo puedo cambiar el nombre de la única encabezado de columna? Por ejemplo gdp a log(gdp)?

data =
    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
  • Definitivamente hay superposición, pero no estaba claro de inmediato a mí de «cambiar el nombre de las columnas de los pandas» que se puede señalar a un único elemento de la columna para cambiar el nombre. Por supuesto, en retrospectiva, es evidente, y si yo había cavado profundo, probablemente me habría dado cuenta de esto, pero creo que esta pregunta / respuesta es mejor en señalarlo.
InformationsquelleAutor natsuki_2002 | 2013-11-03

3 Comentarios

  1. 281
    data.rename(columns={'gdp':'log(gdp)'}, inplace=True)

    La cambiar muestran que acepta un diccionario como un parámetro para columns por lo que acaba de pasar un diccionario con una sola entrada.

    Ver también relacionados con la

    • Esto toma mucho tiempo en una gran dataframe, así que creo que esto no hace algún tipo de copiar todo el dataframe en la memoria?
    • no debería hacer, la mayoría de los pandas operación devolverá una copia y algunos aceptan un inplace param, si se omite este parámetro, entonces este es un bug, se puede hacer tiempos con y sin el param, también intente algo como new_df = df.rename(columns={'new_name':'old_name'}) y ver si es más rápido o no
    • EdChum Gracias. La eliminación de la inplace param casi se duplicó el tiempo de 14 segundos a 26 segundos. Pero el 14 segundos todavía bastante tiempo para cambiar el encabezado..
    • es probablemente vale la pena publicar un tema en el github acerca de esto, por favor incluya su sistema operativo, la versión de python, numpy y pandas versión, además de la salida de df.info y uno de los devs se verá en esta, gracias
    • De esta manera elevar SettingWithCopyWarning: Un valor está tratando de establecerse en una copia de un fragmento de un DataFrame
    • sin publicar una pregunta real con los datos en bruto y el código para reproducir esta advertencia no puedo comentar. Claramente depende de cómo se haya creado este df, probablemente tomó una rebanada o se toma un subconjunto en algún lugar
    • El ajuste con la copia de la advertencia se refiere a los datos, no el cambio de nombre. cambiar el nombre es una mutación de la operación, por lo que si usted mutar un sector que es tal que se genera una copia en lugar de una vista, esta advertencia indica que este cambio no se propagan a la original.
    • sólo una nota, ¡ten cuidado! si la columna de destino no existe,(mal escrito el nombre o así) esto va a hacer nada con ningún error o de advertencia.
    • tengo el mismo problema con el tiempo de ejecución con esto, sin embargo, la `directamente=True, se reduce el tiempo alrededor de un 60%. Todavía se tarda más de lo esperado para ese tipo de tarea. El cálculo de la varianza para cada columna es más rápido.
    • es un poco deprimente por qué algunos de estos simples ops son simplemente más rápido, haciendo una lista de comprensión. Fundamentalmente a pesar de que a menos que tenga una muy grande df, entonces no importa a menos que usted es cambiar el nombre de un montón de columnas en una gran df

  2. 20

    Una implementación mucho más rápidos sería el uso de list-comprehension si necesita cambiar el nombre de una sola columna.

    df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]

    Si surge la necesidad de cambiar el nombre de múltiples columnas, ya sea el uso de expresiones condicionales como:

    df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]

    O, la construcción de un mapeo de uso de un dictionary y realizar el list-comprehension con get operación de ajuste valor por defecto el nombre antiguo:

    col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'}   ## key→old name, value→new name
    
    df.columns = [col_dict.get(x, x) for x in df.columns]

    Tiempos:

    %%timeit
    df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
    10000 loops, best of 3: 168 µs per loop
    
    %%timeit
    df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
    10000 loops, best of 3: 58.5 µs per loop
  3. 10

    ¿Cómo puedo cambiar el nombre de una columna específica de los pandas?

    De v0.24+, para cambiar el nombre de uno (o más) de las columnas en un momento,

    Si necesita cambiar el nombre de TODAS las columnas a la vez,

    • DataFrame.set_axis() método con axis=1. Pasar una lista como la secuencia. Las opciones están disponibles en el lugar de la modificación así.

    rename con axis=1

    df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
    df
    
       y gdp cap
    0  x   x   x
    1  x   x   x
    2  x   x   x
    3  x   x   x
    4  x   x   x

    Con un 0,21+, ahora se puede especificar un axis parámetro con rename:

    df.rename({'gdp':'log(gdp)'}, axis=1)
    # df.rename({'gdp':'log(gdp)'}, axis='columns')
    
       y log(gdp) cap
    0  x        x   x
    1  x        x   x
    2  x        x   x
    3  x        x   x
    4  x        x   x

    (Tenga en cuenta que rename no está en el lugar por defecto, por lo que tendrá que asignar el resultado a.)

    Esta incorporación se ha realizado para mejorar la coherencia con el resto de la API. El nuevo axis argumento es análogo a la columns parámetro—ellos hacen la misma cosa.

    df.rename(columns={'gdp': 'log(gdp)'})
    
       y log(gdp) cap
    0  x        x   x
    1  x        x   x
    2  x        x   x
    3  x        x   x
    4  x        x   x

    rename también acepta una devolución de llamada que se llama una vez para cada columna.

    df.rename(lambda x: x[0], axis=1)
    # df.rename(lambda x: x[0], axis='columns')
    
       y  g  c
    0  x  x  x
    1  x  x  x
    2  x  x  x
    3  x  x  x
    4  x  x  x

    Para esta situación específica, puede que desee utilizar

    df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)

    Índice.str.reemplace

    Similar a replace método de las cadenas en python, pandas, Índice y de la Serie (objeto dtype sólo) definir («vectorizados») str.replace método para la cadena y basado en expresiones regulares de reemplazo.

    df.columns = df.columns.str.replace('gdp', 'log(gdp)')
    df
    
       y log(gdp) cap
    0  x        x   x
    1  x        x   x
    2  x        x   x
    3  x        x   x
    4  x        x   x

    La ventaja de este sobre los otros métodos es que str.replace apoya regex (habilitado por defecto). Consulte la documentación para obtener más información.


    Pasar una lista para set_axis con axis=1

    Llamada set_axis con una lista de encabezado(s). La lista debe ser igual en longitud a la de las columnas/tamaño del índice. set_axis muta el original DataFrame por defecto, pero usted puede especificar inplace=False para devolver una copia modificada.

    df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
    # df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)
    
      cap log(gdp)  y
    0   x        x  x
    1   x        x  x
    2   x        x  x
    3   x        x  x
    4   x        x  x

    Nota: En versiones futuras, inplace predeterminada True.

    Método De Encadenamiento De

    ¿Por qué elegir set_axis cuando ya tenemos una manera eficiente de asignación de columnas con df.columns = ...? Como se muestra por Ted Petrou en [esta respuesta],(https://stackoverflow.com/a/46912050/4909087) set_axis es útil a la hora de la cadena de métodos.

    Comparar

    # new for pandas 0.21+
    df.some_method1()
      .some_method2()
      .set_axis()
      .some_method3()

    Frente a

    # old way
    df1 = df.some_method1()
            .some_method2()
    df1.columns = columns
    df1.some_method3()

    La primera es la más natural y libre flujo de la sintaxis.

Dejar respuesta

Please enter your comment!
Please enter your name here