2016-08-12 196 views
2

我做如下KeyError异常:楠字典

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'] ] 

KeyError: nan 

我试图改变dtypes

df['a'] = df['a'].astype(object) 

却又

KeyError: nan 

有什么不对?

回答

2

@ 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 

如果你想在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 
5

问题是,南是“不是一个数字”,因此它等于没有其他数字,甚至不是另一个南。你可以阅读更多关于它here

为了证明:

from numpy import nan 
nan == nan 
=> False 

从这一点必须遵循楠是不是在你的字典,因为它不等于任何按键。

+1

其实,巨蟒首先检查参考平等,当查找一个字典键:http://stackoverflow.com/questions/6441857/nans-as-key-in-dictionaries –

+3

有趣的:''mapper [np.nan]'返回'南',但' [mapper [x] for df ['a']]'抛出'KeyError:nan'。 –

+1

'df ['a'] [4]是np.nan'是'False':看起来大熊猫没有返回'np.nan',而只是一个'float'('nan')'。 –