Skip to content

Commit 0a52507

Browse files
authored
REF: remove iloc case from _convert_slice_indexer (#31786)
1 parent a8817ba commit 0a52507

File tree

4 files changed

+23
-18
lines changed

4 files changed

+23
-18
lines changed

pandas/core/indexes/base.py

+11-9
Original file line numberDiff line numberDiff line change
@@ -3142,6 +3142,15 @@ def _convert_scalar_indexer(self, key, kind: str_t):
31423142

31433143
return key
31443144

3145+
def _validate_positional_slice(self, key: slice):
3146+
"""
3147+
For positional indexing, a slice must have either int or None
3148+
for each of start, stop, and step.
3149+
"""
3150+
self._validate_indexer("positional", key.start, "iloc")
3151+
self._validate_indexer("positional", key.stop, "iloc")
3152+
self._validate_indexer("positional", key.step, "iloc")
3153+
31453154
def _convert_slice_indexer(self, key: slice, kind=None):
31463155
"""
31473156
Convert a slice indexer.
@@ -3152,16 +3161,9 @@ def _convert_slice_indexer(self, key: slice, kind=None):
31523161
Parameters
31533162
----------
31543163
key : label of the slice bound
3155-
kind : {'loc', 'getitem', 'iloc'} or None
3164+
kind : {'loc', 'getitem'} or None
31563165
"""
3157-
assert kind in ["loc", "getitem", "iloc", None]
3158-
3159-
# validate iloc
3160-
if kind == "iloc":
3161-
self._validate_indexer("positional", key.start, "iloc")
3162-
self._validate_indexer("positional", key.stop, "iloc")
3163-
self._validate_indexer("positional", key.step, "iloc")
3164-
return key
3166+
assert kind in ["loc", "getitem", None], kind
31653167

31663168
# potentially cast the bounds to integers
31673169
start, stop, step = key.start, key.stop, key.step

pandas/core/indexes/numeric.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -394,10 +394,9 @@ def _convert_scalar_indexer(self, key, kind: str):
394394

395395
@Appender(Index._convert_slice_indexer.__doc__)
396396
def _convert_slice_indexer(self, key: slice, kind=None):
397+
assert kind in ["loc", "getitem", None]
397398

398-
if kind == "iloc":
399-
return super()._convert_slice_indexer(key, kind=kind)
400-
399+
# We always treat __getitem__ slicing as label-based
401400
# translate to locations
402401
return self.slice_indexer(key.start, key.stop, key.step, kind=kind)
403402

pandas/core/indexing.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -1685,7 +1685,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int):
16851685

16861686
labels = obj._get_axis(axis)
16871687
indexer = labels.slice_indexer(
1688-
slice_obj.start, slice_obj.stop, slice_obj.step, kind=self.name
1688+
slice_obj.start, slice_obj.stop, slice_obj.step, kind="loc"
16891689
)
16901690

16911691
if isinstance(indexer, slice):
@@ -2035,8 +2035,8 @@ def _get_slice_axis(self, slice_obj: slice, axis: int):
20352035
return obj.copy(deep=False)
20362036

20372037
labels = obj._get_axis(axis)
2038-
indexer = labels._convert_slice_indexer(slice_obj, kind="iloc")
2039-
return self.obj._slice(indexer, axis=axis, kind="iloc")
2038+
labels._validate_positional_slice(slice_obj)
2039+
return self.obj._slice(slice_obj, axis=axis, kind="iloc")
20402040

20412041
def _convert_to_indexer(self, key, axis: int, is_setter: bool = False):
20422042
"""
@@ -2046,7 +2046,8 @@ def _convert_to_indexer(self, key, axis: int, is_setter: bool = False):
20462046

20472047
# make need to convert a float key
20482048
if isinstance(key, slice):
2049-
return labels._convert_slice_indexer(key, kind="iloc")
2049+
labels._validate_positional_slice(key)
2050+
return key
20502051

20512052
elif is_float(key):
20522053
labels._validate_indexer("positional", key, "iloc")

pandas/core/series.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -842,7 +842,10 @@ def _ixs(self, i: int, axis: int = 0):
842842

843843
def _slice(self, slobj: slice, axis: int = 0, kind: str = "getitem") -> "Series":
844844
assert kind in ["getitem", "iloc"]
845-
slobj = self.index._convert_slice_indexer(slobj, kind=kind)
845+
if kind == "getitem":
846+
# If called from getitem, we need to determine whether
847+
# this slice is positional or label-based.
848+
slobj = self.index._convert_slice_indexer(slobj, kind="getitem")
846849
return self._get_values(slobj)
847850

848851
def __getitem__(self, key):
@@ -884,7 +887,7 @@ def __getitem__(self, key):
884887
def _get_with(self, key):
885888
# other: fancy integer or otherwise
886889
if isinstance(key, slice):
887-
return self._slice(key)
890+
return self._slice(key, kind="getitem")
888891
elif isinstance(key, ABCDataFrame):
889892
raise TypeError(
890893
"Indexing a Series with DataFrame is not "

0 commit comments

Comments
 (0)