BUG: IndexError when slicing a series, if a level of MultiIndex contains only NaN values · Issue #42055 · pandas-dev/pandas (original) (raw)
IndexError Traceback (most recent call last) in 2 3 s = pd.Series([0, 1], index=[[pd.NA, pd.NA], ["bar", "baz"]]) ----> 4 s.loc[pd.IndexSlice[:, "bar"]]
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/indexing.py in getitem(self, key) 887 # AttributeError for IntervalTree get_value 888 return self.obj._get_value(*key, takeable=self._takeable) --> 889 return self._getitem_tuple(key) 890 else: 891 # we by definition only have the 0th axis
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/indexing.py in _getitem_tuple(self, tup) 1058 def _getitem_tuple(self, tup: Tuple): 1059 with suppress(IndexingError): -> 1060 return self._getitem_lowerdim(tup) 1061 1062 # no multi-index, so validate all of the indexers
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/indexing.py in _getitem_lowerdim(self, tup) 789 # we may have a nested tuples indexer here 790 if self._is_nested_tuple_indexer(tup): --> 791 return self._getitem_nested_tuple(tup) 792 793 # we maybe be using a tuple to represent multiple dimensions here
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/indexing.py in _getitem_nested_tuple(self, tup) 845 raise ValueError("Too many indices") 846 with suppress(IndexingError): --> 847 return self._handle_lowerdim_multi_index_axis0(tup) 848 849 # this is a series with a multi-index specified a tuple of
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/indexing.py in _handle_lowerdim_multi_index_axis0(self, tup) 1078 try: 1079 # fast path for series or for tup devoid of slices -> 1080 return self._get_label(tup, axis=axis) 1081 except (TypeError, InvalidIndexError): 1082 # slices are unhashable
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/indexing.py in _get_label(self, label, axis) 1071 def _get_label(self, label, axis: int): 1072 # GH#5667 this will fail if the label is not present in the axis. -> 1073 return self.obj.xs(label, axis=axis) 1074 1075 def _handle_lowerdim_multi_index_axis0(self, tup: Tuple):
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/generic.py in xs(self, key, axis, level, drop_level) 3731 if isinstance(index, MultiIndex): 3732 try: -> 3733 loc, new_index = index._get_loc_level( 3734 key, level=0, drop_level=drop_level 3735 )
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/indexes/multi.py in _get_loc_level(self, key, level, drop_level) 3064 indexer = slice(None, None) 3065 ilevels = [i for i in range(len(key)) if key[i] != slice(None, None)] -> 3066 return indexer, maybe_mi_droplevels(indexer, ilevels, drop_level) 3067 else: 3068 indexer = self._get_level_indexer(key, level=level)
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/indexes/multi.py in maybe_mi_droplevels(indexer, levels, drop_level) 2981 for i in sorted(levels, reverse=True): 2982 try: -> 2983 new_index = new_index._drop_level_numbers([i]) 2984 except ValueError: 2985
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/indexes/base.py in _drop_level_numbers(self, levnums) 1639 # set nan if needed 1640 mask = new_codes[0] == -1 -> 1641 result = new_levels[0].take(new_codes[0]) 1642 if mask.any(): 1643 result = result.putmask(mask, np.nan)
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/indexes/base.py in take(self, indices, axis, allow_fill, fill_value, **kwargs) 749 # Note: we discard fill_value and use self._na_value, only relevant 750 # in the case where allow_fill is True and fill_value is not None --> 751 taken = algos.take( 752 self._values, indices, allow_fill=allow_fill, fill_value=self._na_value 753 )
~/.cache/pypoetry/virtualenvs/env-d6X_GUCN-py3.9/lib/python3.9/site-packages/pandas/core/algorithms.py in take(arr, indices, axis, allow_fill, fill_value) 1655 else: 1656 # NumPy style -> 1657 result = arr.take(indices, axis=axis) 1658 return result 1659
IndexError: cannot do a non-empty take from an empty axes.
The example runs as expected, when the index contains a non-NaN value such as "foo"