【问题标题】:KeyError: nan in dictKeyError:字典中的nan
【发布时间】:2016-12-20 00:10:13
【问题描述】:

我按照下面的方式做

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

我试图改变数据类型

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

又一次

KeyError: nan

怎么了?

【问题讨论】:

标签: python numpy dictionary


【解决方案1】:

问题在于 nan 不是“数字”,因此它不等于其他数字,甚至不等于另一个 nan。你可以阅读更多关于它的信息here

演示:

from numpy import nan
nan == nan
=> False

因此,必须遵循 nan 不在您的字典中,因为它不等于任何键。

【讨论】:

  • 实际上,Python 在查找 dict 键时首先检查引用相等性:stackoverflow.com/questions/6441857/nans-as-key-in-dictionaries
  • 有趣:mapper[np.nan] 返回 nan[mapper[x] for x in df['a']] 抛出 KeyError: nan
  • df['a'][4] is np.nanFalse:看来pandas 没有返回np.nan,而只是一个float('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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多