大型索引值导致pandas KeyError

时间:2018-01-25 18:42:58

标签: python pandas

我设置了一个UInt64Index的数据帧,如此

df = pandas.DataFrame([[1,2,3],[4,5,9223943912072220999],[7,8,9]], columns=['a','b','c'])
df = df.set_index('c')
>>> df
                     a  b
c              
3                    1  2
9223943912072220999  4  5
9                    7  8

>>> df.index
UInt64Index([3, 9223943912072220999, 9], dtype='uint64', name=u'c')

现在尝试按索引值访问元素适用于较小的值

>>> df.index[0]
3
>>> df.loc[3]
a    1
b    2
Name: 3, dtype: int64

但是尝试为大值做同样的事情会导致错误

>>> df.index[1]
9223943912072220999
>>> df.loc[9223943912072220999]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/u1/mprager/.virtualenvs/jupyter/local/lib/python2.7/site-packages/pandas/core/indexing.py", line 1373, in __getitem__
    return self._getitem_axis(maybe_callable, axis=axis)
  File "/home/u1/mprager/.virtualenvs/jupyter/local/lib/python2.7/site-packages/pandas/core/indexing.py", line 1626, in _getitem_axis
    self._has_valid_type(key, axis)
  File "/home/u1/mprager/.virtualenvs/jupyter/local/lib/python2.7/site-packages/pandas/core/indexing.py", line 1514, in _has_valid_type
    error()
  File "/home/u1/mprager/.virtualenvs/jupyter/local/lib/python2.7/site-packages/pandas/core/indexing.py", line 1501, in error
    axis=self.obj._get_axis_name(axis)))
KeyError: u'the label [9223943912072220999] is not in the [index]'

我认为这可能是某种dtype问题,但即使我df.loc[df.index[1]]我也会遇到同样的错误。

这是在python 2.7.9上使用pandas 0.22.0

1 个答案:

答案 0 :(得分:4)

可能是一个错误。 9223943912072220999似乎太大而无法容纳标准的C签名长变量,这也会导致loc出现问题。一种替代方法是使用df.index.get_loc,获取索引,然后使用iloc作为基于位置的索引的索引器。

i = df.index.get_loc(9223943912072220999)
df.iloc[i]

a    4
b    5
Name: 9223943912072220999, dtype: int64

另一种选择是将索引作为对象数组处理 -

df.index = df.index.astype(object)

这允许你使用任意大数字(基本上,你可以散列的任何东西现在可以放在一个对象索引中) -

df.loc[9223943912072220999]

a    4
b    5
Name: 9223943912072220999, dtype: int64

请注意,就替代方案而言,这是更糟糕的方案之一,并且可能性能较差。