Closed
Description
ser = pd.Series([3, 4, 5])
>>> ser[:2] # <- should this behave like loc or iloc?
>>> ser.loc[:2]
>>> ser.iloc[:2]
Focusing only on Integer-dtype indexes, i.e. Int64Index, UInt64Index, RangeIndex, and NumericIndex[inty].
ser[2]
and ser[[2]]
each treat the indexing as label-based instead of positional. But ser[:2]
treats the slice as positional instead of label-based.
We've deprecated some of these cases in #45162, but as I go to enforce the deprecation I think I screwed up and issued the warning for too few cases. In particular, to keep the number of warnings down I excluded some cases
elif start is None and stop is None:
# label-based vs positional is irrelevant
pass
elif isinstance(self, ABCRangeIndex) and self._range == range(
len(self)
):
# In this case there is no difference between label-based
# and positional, so nothing will change.
pass
elif (
self.dtype.kind in ["i", "u"]
and self._is_strictly_monotonic_increasing
and len(self) > 0
and self[0] == 0
and self[-1] == len(self) - 1
):
# We are range-like, e.g. created with Index(np.arange(N))
pass
The elif start is None and stop is None
case is correct, but the other two are wrong bc with .loc
slicing is right-inclusive.
If I enforce the deprecation for these extra two cases, I get 555 test failures, so this isn't trivial.