Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Indexing single level with list of missing labels raises if (and only if) it has length 1 #27148

Closed
toobaz opened this issue Jun 30, 2019 · 0 comments · Fixed by #27154
Closed
Labels
Indexing Related to indexing on series/frames, not to indexes themselves MultiIndex
Milestone

Comments

@toobaz
Copy link
Member

toobaz commented Jun 30, 2019

Code Sample, a copy-pastable example if possible

In [2]: mi = pd.MultiIndex.from_tuples([[1, 2, -1], [3,4, -2], [5, 6, -3]])                                                                                                                                                                   

In [3]: s = pd.Series(1, mi)                                                                                                                                                                                                                  

In [4]: s.loc[[100, 101]]                                                                                                                                                                                                                     
Out[4]: Series([], dtype: int64)

In [5]: s.loc[[100]]                                                                                                                                                                                                                          
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-5-7a5bc11c892d> in <module>
----> 1 s.loc[[100]]

~/nobackup/repo/pandas/pandas/core/indexing.py in __getitem__(self, key)
   1427 
   1428             maybe_callable = com.apply_if_callable(key, self.obj)
-> 1429             return self._getitem_axis(maybe_callable, axis=axis)
   1430 
   1431     def _is_scalar_access(self, key):

~/nobackup/repo/pandas/pandas/core/indexing.py in _getitem_axis(self, key, axis)
   1829                     raise ValueError('Cannot index with multidimensional key')
   1830 
-> 1831                 return self._getitem_iterable(key, axis=axis)
   1832 
   1833             # nested tuple slicing

~/nobackup/repo/pandas/pandas/core/indexing.py in _getitem_iterable(self, key, axis)
   1131             # A collection of keys
   1132             keyarr, indexer = self._get_listlike_indexer(key, axis,
-> 1133                                                          raise_missing=False)
   1134             return self.obj._reindex_with_indexers({axis: [keyarr, indexer]},
   1135                                                    copy=True, allow_dups=True)

~/nobackup/repo/pandas/pandas/core/indexing.py in _get_listlike_indexer(self, key, axis, raise_missing)
   1068         # if it cannot handle:
   1069         indexer, keyarr = ax._convert_listlike_indexer(key,
-> 1070                                                        kind=self.name)
   1071         # We only act on all found values:
   1072         if indexer is not None and (indexer != -1).all():

~/nobackup/repo/pandas/pandas/core/indexes/multi.py in _convert_listlike_indexer(self, keyarr, kind)
   2255             mask = check == -1
   2256             if mask.any():
-> 2257                 raise KeyError('%s not in index' % keyarr[mask])
   2258 
   2259         return indexer, keyarr

KeyError: '[100] not in index'

Problem description

Because of a trivial typo, behavior depends on whether the list has length at least 2. The "one item" behavior is arguably seldomly used, and future incompatible (xref: #20916 ).

Expected Output

Like Out[4]:.

Output of pd.show_versions()

INSTALLED VERSIONS

commit : b491329
python : 3.7.3.candidate.1
python-bits : 64
OS : Linux
OS-release : 4.9.0-9-amd64
machine : x86_64
processor :
byteorder : little
LC_ALL : None
LANG : it_IT.UTF-8
LOCALE : it_IT.UTF-8

pandas : 0.25.0.dev0+849.gb4913295a
numpy : 1.16.4
pytz : 2016.7
dateutil : 2.8.0
pip : 9.0.1
setuptools : 41.0.1
Cython : 0.29.2
pytest : 4.6.3
hypothesis : 3.71.11
sphinx : 1.4.9
blosc : None
feather : None
xlsxwriter : 0.9.6
lxml.etree : 4.3.2
html5lib : 0.999999999
pymysql : None
psycopg2 : None
jinja2 : 2.10.1
IPython : 7.5.0
pandas_datareader: 0.2.1
bs4 : 4.5.3
bottleneck : 1.2.1
fastparquet : None
gcsfs : None
lxml.etree : 4.3.2
matplotlib : 3.0.2
numexpr : 2.6.9
openpyxl : 2.3.0
pandas_gbq : None
pyarrow : None
pytables : None
s3fs : None
scipy : 1.1.0
sqlalchemy : 1.0.15
tables : 3.4.4
xarray : None
xlrd : 1.0.0
xlwt : 1.3.0
xlsxwriter : 0.9.6

@toobaz toobaz added Indexing Related to indexing on series/frames, not to indexes themselves MultiIndex labels Jun 30, 2019
toobaz added a commit to toobaz/pandas that referenced this issue Jun 30, 2019
toobaz added a commit to toobaz/pandas that referenced this issue Jun 30, 2019
toobaz added a commit to toobaz/pandas that referenced this issue Jun 30, 2019
toobaz added a commit to toobaz/pandas that referenced this issue Jun 30, 2019
toobaz added a commit to toobaz/pandas that referenced this issue Jul 1, 2019
toobaz added a commit to toobaz/pandas that referenced this issue Jul 4, 2019
toobaz added a commit to toobaz/pandas that referenced this issue Jul 4, 2019
toobaz added a commit to toobaz/pandas that referenced this issue Jul 4, 2019
@jreback jreback added this to the 0.25.0 milestone Jul 8, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Indexing Related to indexing on series/frames, not to indexes themselves MultiIndex
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants