Quiero reemplazar algunos valores en una columna de un marco de datos usando un diccionario que asigna los códigos antiguos a los códigos nuevos.
di = dict( { "myVar": {11:0, 204:11} } ) mydata.replace( to_replace = di, inplace = True ) Pero algunos de los códigos nuevos y viejos se superponen. Cuando uso el método .replace del marco de datos, encuentro el error 'Replacement not allowed with overlapping keys and values'
Mi solución actual es reemplazar las teclas ofensivas manualmente y luego aplicar el diccionario a los casos restantes que no se superponen.
mydata.loc[ mydata.myVar == 11, "myVar" ] = 0 di = dict( { "myVar": {204:11} } ) mydata.replace( to_replace = di, inplace = True )¿Hay una forma más compacta de hacer esto?
Encontré una respuesta aquí que usa el método .map en una serie junto con un diccionario. Aquí hay un diccionario de grabación de ejemplo con claves y valores superpuestos.
import pandas as pd >>> df = pd.DataFrame( [1,2,3,4,1], columns = ['Var'] ) >>> df Var 0 1 1 2 2 3 3 4 4 1 >>> dict = {1:2, 2:3, 3:1, 4:3} >>> df.Var.map( dict ) 0 2 1 3 2 1 3 3 4 2 Name: Var, dtype: int64ACTUALIZAR:
Con map, cada valor de la serie original debe asignarse a un nuevo valor. Si el diccionario de asignación no contiene todos los valores de la columna original, los valores no asignados se asignan a NaN.
>>> df = pd.DataFrame( [1,2,3,4,1], columns = ['Var'] ) >>> dict = {1:2, 2:3, 3:1} >>> df.Var.map( dict ) 0 2.0 1 3.0 2 1.0 3 NaN 4 2.0 Name: Var, dtype: float64