¿Cómo agregar un sufijo (o prefijo) a cada nombre de columna?

88

Quiero agregar un _xsufijo a cada nombre de columna así:

featuresA = myPandasDataFrame.columns.values + '_x'

¿Cómo hago esto? Además, si quisiera agregar x_como sufijo, ¿cómo cambiaría la solución?

Klausos Klausos
fuente

Respuestas:

120

Puede utilizar una listcomprensión:

df.columns = [str(col) + '_x' for col in df.columns]

También hay métodos integrados como .add_suffix()y .add_prefix()como se menciona en otra respuesta.

Stefan
fuente
¡esta es la respuesta más simple y elegante!
Jinhua Wang
163

En mi opinión, la siguiente es la forma más agradable de agregar un sufijo.

df = df.add_suffix('_some_suffix')

Como es una función que se llama en DataFrame y devuelve DataFrame, puede usarla en la cadena de llamadas.

Jarosław Szymczak
fuente
14
Puede usar add_prefix si desea agregar un prefijo a los nombres.
Jorge
9
Lástima que esto no pueda ser mutable (es decir, no tiene una inplace=Trueopción de parámetro). De lo contrario, perfecto.
ijoseph
Creo que esto es mejor que la respuesta aceptada en algunas circunstancias, porque se puede usar en una cadena de operaciones en una sola declaración, en lugar de necesitar su propia declaración.
Capitán Lepton
@CaptainLepton ¿cuándo no sería mejor esta respuesta que la respuesta aceptada?
baxx
1
Si el sufijo no es una constante. El título habla de sufijos. La publicación reduce el alcance a un único sufijo constante, pero si estamos respondiendo el título de la publicación en términos generales, entonces configurar las columnas a través de una lista de comprensión u otro iterable es más flexible
Capitán Lepton
17

Concatenación elegante en el lugar

Si está intentando modificar dfen el lugar, entonces la opción más barata (y más simple) es la adición en el lugar directamente en df.columns(es decir, usar Index.__iadd__).

df = pd.DataFrame({"A": [9, 4, 2, 1], "B": [12, 7, 5, 4]})
df

   A   B
0  9  12
1  4   7
2  2   5
3  1   4

df.columns += '_some_suffix'
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Para agregar un prefijo, usaría de manera similar

df.columns = 'some_prefix_' + df.columns
df

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Otra opción económica es usar una lista de comprensión con f-stringformato (disponible en python3.6 +).

df.columns = [f'{c}_some_suffix' for c in df]
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Y para prefijo, de manera similar,

df.columns = [f'some_prefix{c}' for c in df]

Encadenamiento de métodos

También es posible agregar * correcciones mientras se encadena el método. Para agregar un sufijo, useDataFrame.add_suffix

df.add_suffix('_some_suffix')

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Esto devuelve una copia de los datos. IOW, dfno se modifica.

La adición de prefijos también se realiza con DataFrame.add_prefix.

df.add_prefix('some_prefix_')

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Que tampoco modifica df.


Crítica de add_*fix

Estos son buenos métodos si está intentando realizar un encadenamiento de métodos:

df.some_method1().some_method2().add_*fix(...)

Sin embargo, add_prefix(y add_suffix) crea una copia de todo el marco de datos, solo para modificar los encabezados. Si cree que esto es un desperdicio, pero aún desea encadenar, puede llamar a pipe:

def add_suffix(df):
    df.columns += '_some_suffix'
    return df

df.some_method1().some_method2().pipe(add_suffix)
cs95
fuente
¡Esto es elegante! ¿Qué sucede si desea agregar un prefijo o sufijo a un subconjunto de las columnas, por ejemplo, las columnas cuyos nombres contienen una palabra común (como newo old) en lugar de todas las columnas? Gracias.
Bowen Liu
1
@BowenLiu Sugeriría ir con df.rename () en su lugar ... Pase un diccionario de asignación de nombres a sus nuevos nombres. Luego llame a renombrar con axis = 1. También puede utilizar la asignación de comprensión de lista condicional.
cs95
Funciona solo con tipos de datos regulares como nombres de columna, no si sus columnas son un RangeIndex como, por ejemplo, df = pd.DataFrame([[1,2,3]]*10)-> df.columns, entonces usaríadf.add_suffix('_x')
Lorenz
puedes hacer lo df.columns = df.columns.astype(str) + '_x' que muestra mi primer método.
cs95
4

No he visto esta solución propuesta anteriormente, así que agregué esto a la lista:

df.columns += '_x'

Y puede adaptarse fácilmente al escenario de prefijo.

JPA
fuente
La mejor solución para el sufijo, aunque no se puede utilizar como prefijo, por supuesto.
Lorenz
Funciona solo con tipos de datos regulares en los nombres de las columnas, no si sus columnas son un RangeIndex como, por ejemplo, df = pd.DataFrame([[1,2,3]]*10)-> df.columns, entonces usaríadf.add_suffix('_x')
Lorenz
1

Conozco 4 formas de agregar un sufijo (o prefijo) a los nombres de sus columnas:

1- df.columns = [str(col) + '_some_suffix' for col in df.columns]

o

2- df.rename(columns= lambda col: col+'_some_suffix')

o

3- df.columns += '_some_suffix'mucho facil.

o, el más bonito:

3- df.add_suffix('_some_suffix')

Mahmoud Reda
fuente
0

Usando DataFrame.rename.

Desaprobación de add_prefixyadd_suffix

En futuras versiones de pandas add_prefixy add_suffixquedará obsoleto . El nuevo método recomendado es utilizar DataFrame.rename:

df = pd.DataFrame({'A': range(3), 'B': range(4, 7)})
print(df)
   A  B
0  0  4
1  1  5
2  2  6

Usando renamecon axis=1y formato de cadena:

df.rename('col_{}'.format, axis=1)
# or df.rename(columns='col_{}'.format)

   col_A  col_B
0      0      4
1      1      5
2      2      6

Para sobrescribir los nombres de sus columnas, podemos asignar los valores devueltos a nuestro df:

df = df.rename('col_{}'.format, axis=1)

o use inplace=True:

df.rename('col_{}'.format, axis=1, inplace=True)
Erfan
fuente