Reemplazo de valores de columna en un dataframe de pandas

Estoy tratando de reemplazar los valores en una columna de un dataframe. La columna (‘femenino’) solo contiene los valores ‘femenino’ y ‘masculino’.

He probado lo siguiente:

w['female']['female']='1' w['female']['male']='0' 

Pero reciba la misma copia exacta de los resultados anteriores.

Lo ideal sería obtener una salida que se asemejara al siguiente bucle de elementos.

 if w['female'] =='female': w['female'] = '1'; else: w['female'] = '0'; 

He revisado la documentación de las trampas ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ) pero no puedo entender por qué no sucede nada.

Cualquier ayuda será apreciada.

Si entiendo bien, quieres algo como esto:

 w['female'] = w['female'].map({'female': 1, 'male': 0}) 

(Aquí convierto los valores a números en lugar de cadenas que contienen números. Puede convertirlos a "1" y "0" , si realmente lo desea, pero no estoy seguro de por qué lo querría).

La razón por la que su código no funciona es porque usar ['female'] en una columna (el segundo 'female' en su w['female']['female'] ) no significa “seleccionar filas donde el valor es ‘hembra'”. Significa seleccionar filas donde el índice es ‘femenino’, de los cuales puede que no haya ninguno en su DataFrame.

Puedes editar un subconjunto de un dataframe usando loc:

 df.loc[, ] 

En este caso:

 w.loc[w.female != 'female', 'female'] = 0 w.loc[w.female == 'female', 'female'] = 1 
 w.female.replace(to_replace=dict(female=1, male=0), inplace=True) 

Ver pandas.DataFrame.replace () docs .

Ligera variación:

 w.female.replace(['male', 'female'], [1, 0], inplace=True) 

Esto también debería funcionar:

 w.female[w.female == 'female'] = 1 w.female[w.female == 'male'] = 0 

También puedes usar apply con .get ie

w['female'] = w['female'].apply({'male':0, 'female':1}.get) :

 w = pd.DataFrame({'female':['female','male','female']}) print(w) 

Marco de datos w :

  female 0 female 1 male 2 female 

Usando apply para reemplazar valores del diccionario:

 w['female'] = w['female'].apply({'male':0, 'female':1}.get) print(w) 

Resultado:

  female 0 1 1 0 2 1 

Nota: se debe usar la apply con diccionario si todos los valores posibles de las columnas en el dataframe están definidos en el diccionario; de lo contrario, estará vacío para aquellos que no están definidos en el diccionario.

Alternativamente, existe la función incorporada pd.get_dummies para este tipo de asignaciones:

 w['female'] = pd.get_dummies(w['female'],drop_first = True) 

Esto le proporciona un dataframe con dos columnas, una para cada valor que aparece en w [‘female’], del cual se elimina la primera (porque puede inferirla de la que queda). La nueva columna se nombra automáticamente como la cadena que reemplazó.

Esto es especialmente útil si tiene variables categóricas con más de dos valores posibles. Esta función crea tantas variables ficticias necesarias para distinguir entre todos los casos. Tenga cuidado de no asignar todo el dataframe a una sola columna, sino que si w [‘female’] podría ser ‘male’, ‘female’ o ‘neutral’, haga algo como esto:

 w = pd.concat([w, pd.get_dummies(w['female'], drop_first = True)], axis = 1]) w.drop('female', axis = 1, inplace = True) 

Luego te quedan dos columnas nuevas que te dan la encoding ficticia de ‘hembra’ y te deshiciste de la columna con las cuerdas.

Esto es muy compacto:

 w['female'][w['female'] == 'female']=1 w['female'][w['female'] == 'male']=0 

Otra buena:

 w['female'] = w['female'].replace(regex='female', value=1) w['female'] = w['female'].replace(regex='male', value=0) 

También hay una función en pandas llamada factorize que puedes usar para hacer este tipo de trabajo automáticamente. Convierte las tags en números: ['male', 'female', 'male'] -> [0, 1, 0] . Vea esta respuesta para más información.

Creo que en respuesta debería señalar qué tipo de objeto obtienes en todos los métodos sugeridos anteriormente: es Series o DataFrame.

Cuando se obtiene la columna por w.female. o w[[2]] (donde, supongamos que 2 es el número de su columna), volverá a tener DataFrame. Entonces, en este caso, puedes usar los métodos de .replace como .replace .

Cuando usas .loc o iloc vuelves a la serie, y la serie no tiene el método .replace , por lo que debes usar métodos como apply , map , etc.