我正在尝试映射我要更改的值。 当我像这样>> df [column] .map(dictionary)应用“ map”时,不在词典中的值将转换为NaN。我认为原因是该系列中没有匹配的值,对吗?如果是这样,什么也不用,而是转换为NaN?我该如何使用df.map()而不是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
或
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
答案 0 :(得分:2)
如果您坚持map
而不是通过可通话对象
df.map(lambda x: mapping.get(x,x))
答案 1 :(得分:1)
要更改默认值,可以添加一个函数(此处为func):
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))
答案 2 :(得分:0)
此行为是有意的。由于无法应用mapping
,因此值为NaN
。
为了使用映射,您必须创建一个不会更改数据的特定值(如果您进行乘法,则为1,如果进行加法,则为0),然后将该值添加到映射中。
或者,在完成映射后,您可以将所有NaN
值替换为中性值(如0.0)。
与简单地使用replace
相比,这两种方法的工作量都更大。