KeyError:dict中的nan

Edw*_*ard 3 python dictionary numpy

我这样做

import numpy as np
from numpy import nan
df = pd.DataFrame({'a':[1, 2, 0, 1, np.nan, 2, 0]})
mapper = {2.0: 0.0, 1.0: 1.0 ,0.0: 2.0, nan : nan}
df['a'] = [ mapper[x] for x in df['a'] ]
Run Code Online (Sandbox Code Playgroud)

KeyError: nan
Run Code Online (Sandbox Code Playgroud)

我试图改变dtypes

df['a'] = df['a'].astype(object)
Run Code Online (Sandbox Code Playgroud)

但又来了

KeyError: nan
Run Code Online (Sandbox Code Playgroud)

怎么了?

shx*_*hx2 6

问题是,nan"不是一个数字",因此它不等于其他数字,甚至不是另一个数字.你可以在这里阅读更多相关信息.

展示:

from numpy import nan
nan == nan
=> False
Run Code Online (Sandbox Code Playgroud)

从这一点来看,必须遵循南不在你的词典中,因为它不等于任何键.

  • 有趣的是:`mapper [np.nan]`返回`nan`但是`[map] [x] for x in df ['a']]`抛出一个`KeyError:nan`. (3认同)
  • `df['a'][4] 是 np.nan` 是 `False`:pandas 似乎没有返回 `np.nan`,而只是一个 `float('nan')`。 (2认同)

Alb*_*oso 6

@shx2 解释了为什么会发生这种情况。但是你仍然可以做你想做的——只是忘记NaN并使用Series.map

import numpy as np
import pandas as pd

df = pd.DataFrame({'a': [1, 2, 0, 1, np.nan, 2, 0]})
mapper = {2.0: 0.0, 1.0: 1.0 ,0.0: 2.0}
df['a'] = df['a'].map(mapper)
print(df)

#      a
# 0  1.0
# 1  0.0
# 2  2.0
# 3  1.0
# 4  NaN
# 5  0.0
# 6  2.0
Run Code Online (Sandbox Code Playgroud)

如果要将NaN条目映射到,例如55,请使用.fillna()

df['a'] = df['a'].fillna(55)
print(df)

#       a
# 0   1.0
# 1   0.0
# 2   2.0
# 3   1.0
# 4  55.0
# 5   0.0
# 6   2.0
Run Code Online (Sandbox Code Playgroud)