Tengo un marco de datos de la siguiente manera:
import pandas as pd df = pd.DataFrame({'sent.1':[0,1,0,1], 'sent.2':[0,1,1,0], 'sent.3':[0,0,0,1], 'sent.4':[1,1,0,1] })Estoy tratando de reemplazar los valores distintos de cero con el quinto carácter en los nombres de las columnas (que es la parte numérica de los nombres de las columnas), por lo que el resultado debería ser,
sent.1 sent.2 sent.3 sent.4 0 0 0 0 4 1 1 2 0 4 2 0 2 0 0 3 1 0 3 4He intentado lo siguiente pero no funciona,
print(df.replace(1, pd.Series([i[5] for i in df.columns], [i[5] for i in df.columns])))Sin embargo, cuando lo reemplazo con el nombre de la columna, el código anterior funciona, por lo que no estoy seguro de qué parte está mal.
print(df.replace(1, pd.Series(df.columns, df.columns)))Dado que está tratando con 1 y 0, en realidad puede usar simplemente multiplicar el marco de datos por un rango:
df = df * range(1, df.shape[1] + 1)Producción:
sent.1 sent.2 sent.3 sent.4 0 0 0 0 4 1 1 2 0 4 2 0 2 0 0 3 1 0 3 4O, si desea tomar los números de los nombres de las columnas:
df = df * df.columns.str.split('.').str[-1].astype(int)podría usar la multiplicación de cadenas en una matriz booleana para colocar las cadenas según la condición y where restaurar los ceros:
mask = df.ne(0) (mask*df.columns.str[5]).where(mask, 0)Para tener números enteros:
mask = df.ne(0) (mask*df.columns.str[5].astype(int))producción:
sent.1 sent.2 sent.3 sent.4 0 0 0 0 4 1 1 2 0 4 2 0 2 0 0 3 1 0 3 4Y otro, trabajando con una condición arbitraria (aquí s.ne(0) ):
df.apply(lambda s: s.mask(s.ne(0), s.name.rpartition('.')[-1]))