Tengo un marco de datos con columnas como

Name  Date  Date_x  Date_y  A  A_x  A_y..

Y necesito agregar _z a las columnas (excepto la columna Nombre) que aún no tienen _x o _y. Entonces, quiero que la salida sea similar a

Name  Date_z  Date_x  Date_y  A_z  A_x  A_y...

Lo he intentado.

df.iloc[:,~df.columns.str.contains('x|y|Name')]=df.iloc[:,~df.columns.str.contains('x|y|Name')].add_suffix("_z")
# doesn't add suffixes and replaces columns with all nans

df.columns=df.columns.map(lambda x : x+'_z' if "x" not in x or "y" not in x else x) 
#many variations of this but seems to add _z to all of the column names
2
Gingerhaze 2 oct. 2019 a las 22:55

4 respuestas

La mejor respuesta

¿Qué tal:

df.columns = [x if x=='Name' or '_' in x else x+'_z' for x in df.columns]
4
Quang Hoang 2 oct. 2019 a las 20:02

También puedes probar:

df.rename(columns = lambda x: x if x=='Name' or '_' in x else x+'_z')

Robando un poco de Quang Hoang;)

1
Quickbeam2k1 2 oct. 2019 a las 21:07

Usaría index.putmask de la siguiente manera:

m = (df.columns == 'Name') | df.columns.str[-2:].isin(['_x','_y'])
df.columns = df.columns.putmask(~m, df.columns+'_z')

In [739]: df.columns
Out[739]: Index(['Name', 'Date_z', 'Date_x', 'Date_y', 'A_z', 'A_x', 'A_y'], dty
pe='object')
0
Andy L. 2 oct. 2019 a las 20:34

Agregue '_z' donde el trozo de columna está duplicado y sin sufijo.

m = (df.columns.str.split('_').str[0].duplicated(keep=False)
     & ~df.columns.str.contains('_'))

df.columns = df.columns.where(~m, df.columns+'_z')
0
ALollz 2 oct. 2019 a las 20:08
58208517