Skip to content

ERR: missing key not displayed in exception message for IntervalIndex #27365

Closed
@simonjayhawkins

Description

@simonjayhawkins

Code Sample, a copy-pastable example if possible

adapted from test_non_matching in pandas\tests\indexing\interval\test_interval.py

>>> import numpy as np
>>> import pandas as pd
>>> pd.__version__
'0.25.0rc0+59.g0437f6899'
>>>
>>> s=pd.Series(np.arange(5), pd.IntervalIndex.from_breaks(np.arange(6)))
>>> s
(0, 1]    0
(1, 2]    1
(2, 3]    2
(3, 4]    3
(4, 5]    4
dtype: int32
>>>
>>> s.loc[[4,5]]
(3, 4]    3
(4, 5]    4
dtype: int32
>>>
>>> s.loc[[4,5,6]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1409, in __getitem__
    return self._getitem_axis(maybe_callable, axis=axis)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1816, in _getitem_axis
    return self._getitem_iterable(key, axis=axis)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1118, in _getitem_iterable
    keyarr, indexer = self._get_listlike_indexer(key, axis, raise_missing=False)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1060, in _get_listlike_indexer
    indexer, keyarr = ax._convert_listlike_indexer(key, kind=self.name)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexes\base.py", line 3239, in _convert_listlike_indexer
    indexer = self._convert_list_indexer(keyarr, kind=kind)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexes\interval.py", line 626, in _convert_list_indexer
    raise KeyError
KeyError
>>>
>>> s.to_frame().loc[[4,5,6]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1409, in __getitem__
    return self._getitem_axis(maybe_callable, axis=axis)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1816, in _getitem_axis
    return self._getitem_iterable(key, axis=axis)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1118, in _getitem_iterable
    keyarr, indexer = self._get_listlike_indexer(key, axis, raise_missing=False)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1060, in _get_listlike_indexer
    indexer, keyarr = ax._convert_listlike_indexer(key, kind=self.name)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexes\base.py", line 3239, in _convert_listlike_indexer
    indexer = self._convert_list_indexer(keyarr, kind=kind)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexes\interval.py", line 626, in _convert_list_indexer
    raise KeyError
KeyError
>>>

Problem description

With a list indexer, the missing key should be in the exception message

Expected Output

KeyError: 6

another example - from test_loc_with_overlap in pandas\tests\indexing\interval\test_interval_new.py

>>> idx = pd.IntervalIndex.from_tuples([(1, 5), (3, 7)])
>>> s = pd.Series(range(len(idx)), index=idx)
>>> s
(1, 5]    0
(3, 7]    1
dtype: int64
>>>
>>> s.loc[pd.Interval(3, 5)]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1409, in __getitem__
    return self._getitem_axis(maybe_callable, axis=axis)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1827, in _getitem_axis
    return self._get_label(key, axis=axis)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 152, in _get_label
    return self.obj._xs(label, axis=axis)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\generic.py", line 3738, in xs
    loc = self.index.get_loc(key)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexes\interval.py", line 875, in get_loc
    raise KeyError(key)
KeyError: Interval(3, 5, closed='right')
>>>
>>> s.loc[[pd.Interval(3, 5)]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1409, in __getitem__
    return self._getitem_axis(maybe_callable, axis=axis)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1816, in _getitem_axis
    return self._getitem_iterable(key, axis=axis)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1118, in _getitem_iterable
    keyarr, indexer = self._get_listlike_indexer(key, axis, raise_missing=False)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexing.py", line 1060, in _get_listlike_indexer
    indexer, keyarr = ax._convert_listlike_indexer(key, kind=self.name)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexes\base.py", line 3239, in _convert_listlike_indexer
    indexer = self._convert_list_indexer(keyarr, kind=kind)
  File "C:\Users\simon\OneDrive\code\pandas-simonjayhawkins\pandas\core\indexes\interval.py", line 626, in _convert_list_indexer
    raise KeyError
KeyError
>>>

Output of pd.show_versions()

[paste the output of pd.show_versions() here below this line]

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugError ReportingIncorrect or improved errors from pandasIndexingRelated to indexing on series/frames, not to indexes themselvesIntervalInterval data type

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions