Estoy tratando de reemplazar los valores en una columna de un marco de datos. La columna ('femenino') solo contiene los valores 'femenino' y 'masculino'.
He probado lo siguiente:
w['female']['female']='1'
w['female']['male']='0'
Pero reciba exactamente la misma copia de los resultados anteriores.
Idealmente, me gustaría obtener algo de salida que se asemeje al siguiente elemento de bucle.
if w['female'] =='female':
w['female'] = '1';
else:
w['female'] = '0';
He revisado la documentación de gotchas ( http://pandas.pydata.org/pandas-docs/stable/gotchas.html ) pero no puedo entender por qué no sucede nada.
Cualquier ayuda será apreciada.
.loc
sintaxis para evitarSettingWithCopyWarning
: pandas.pydata.org/pandas-docs/stable/…Puede editar un subconjunto de un marco de datos utilizando loc:
En este caso:
fuente
Ver pandas.DataFrame.replace () docs .
fuente
Ligera variación:
fuente
Esto también debería funcionar:
fuente
También se puede usar
apply
con.get
iew['female'] = w['female'].apply({'male':0, 'female':1}.get)
:Marco de datos
w
:Utilizando
apply
para reemplazar valores del diccionario:Resultado:
Nota:
apply
con el diccionario se debe usar si todos los valores posibles de las columnas en el marco de datos están definidos en el diccionario, de lo contrario, tendrá vacío para los que no están definidos en el diccionario.fuente
Esto es muy compacto:
Otra buena:
fuente
Alternativamente, existe la función incorporada pd.get_dummies para este tipo de tareas:
Esto le proporciona un marco de datos con dos columnas, una para cada valor que aparece en w ['hembra'], de las cuales suelta el primero (porque puede inferirlo 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 marco de datos a una sola columna, sino que si w ['mujer'] podría ser 'hombre', 'mujer' o 'neutral', haga algo como esto:
Luego te quedan dos columnas nuevas que te dan la codificación ficticia de 'hembra' y te deshaces de la columna con las cadenas.
fuente
Usando
Series.map
conSeries.fillna
Si su columna contiene más cadenas que solo
female
ymale
,Series.map
fallará en este caso ya que regresaráNaN
para otros valores.Es por eso que tenemos que encadenarlo con
fillna
:Ejemplo por qué
.map
falla :Para el método correcto , encadenamos
map
confillna
, por lo que rellenamosNaN
con los valores de la columna original:fuente
También hay una función
pandas
llamadafactorize
que puede usar para realizar automáticamente este tipo de trabajo. Convierte las etiquetas a los números:['male', 'female', 'male'] -> [0, 1, 0]
. Vea esta respuesta para más información.fuente
Creo que en respuesta debería señalarse qué tipo de objeto obtiene en todos los métodos sugeridos anteriormente: ¿es Serie o Marco de datos?
Cuando obtenga una columna por
w.female.
ow[[2]]
(donde, supongamos, 2 es el número de su columna), obtendrá DataFrame. Entonces, en este caso, puede usar métodos DataFrame como.replace
.Cuando usa
.loc
oiloc
recupera Series, y Series no tienen.replace
método, por lo que debe usar métodos comoapply
,map
etc.fuente