Estoy tratando de mapear mis valores que quiero cambiar. Cuando aplico 'map' como este >> df [column] .map (diccionario), los valores que no están en el diccionario se convierten a NaN. Creo que la razón es que no hay valores coincidentes en la serie, ¿verdad? Si es así, ¿no debería aplicarse nada en lugar de convertir a NaN? ¿Cómo puedo resolver este problema usando df.map () en lugar de df.replace ()?

df1 = pd.Series(['a','b','c','d'])
df
0    a
1    b
2    c
3    d
dtype: object

mapping = {'a' : 0, 'b' : 1, 'c' : 2}
df1.map(mapping)
0    0.0
1    1.0
2    2.0
3    NaN
dtype: float64

O

df1 = pd.Series(['a','b','c','d'])
df
0    a
1    b
2    c
3    d
dtype: object

mapping = {'k' : 0, 'e' : 1, 'f' : 2}
df1.map(mapping)

0   NaN
1   NaN
2   NaN
3   NaN
dtype: float64
3
justin_sakong 8 sep. 2018 a las 18:17

3 respuestas

La mejor respuesta

Este comportamiento es intencionado. Como mapping no se puede aplicar, el valor es NaN. Para usar el mapeo, debe crear un valor específico que no cambie sus datos (si realiza la multiplicación, sería 1, si suma además de 0) y agregue ese valor a su mapeo.

Alternativamente, puede reemplazar todos los valores NaN después de haber realizado el mapeo con un valor neutral como 0.0.

De cualquier manera es mucho más trabajo que simplemente usar replace.

1
not_a_bot_no_really_82353 8 sep. 2018 a las 15:26

Para cambiar el valor predeterminado, puede agregar una función (func, aquí):

mapping = {'k' : 0, 'e' : 1, 'f' : 2}
mapping.setdefault('Default', 'write watherver you want here')
def func(x, mapping):
    try:
        tmp=mapping[x]
        return(tmp)
    except:
        return('default value')
df1.map(lambda x: func(x, mapping))
1
RobJan 8 sep. 2018 a las 16:08

Si insiste en map, pase un invocable

df.map(lambda x: mapping.get(x,x))
3
piRSquared 8 sep. 2018 a las 15:41