Skip to content

Commit a076e6a

Browse files
committed
REF: remove iloc case from _convert_slice_indexer
1 parent cf01369 commit a076e6a

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("slice", key.start, "iloc")
3151+
self._validate_indexer("slice", key.stop, "iloc")
3152+
self._validate_indexer("slice", 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("slice", key.start, "iloc")
3162-
self._validate_indexer("slice", key.stop, "iloc")
3163-
self._validate_indexer("slice", 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
@@ -1752,7 +1752,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int):
17521752

17531753
labels = obj._get_axis(axis)
17541754
indexer = labels.slice_indexer(
1755-
slice_obj.start, slice_obj.stop, slice_obj.step, kind=self.name
1755+
slice_obj.start, slice_obj.stop, slice_obj.step, kind="loc"
17561756
)
17571757

17581758
if isinstance(indexer, slice):
@@ -2019,8 +2019,8 @@ def _get_slice_axis(self, slice_obj: slice, axis: int):
20192019
return obj.copy(deep=False)
20202020

20212021
labels = obj._get_axis(axis)
2022-
indexer = labels._convert_slice_indexer(slice_obj, kind="iloc")
2023-
return self.obj._slice(indexer, axis=axis, kind="iloc")
2022+
labels._validate_positional_slice(slice_obj)
2023+
return self.obj._slice(slice_obj, axis=axis, kind="iloc")
20242024

20252025
def _convert_to_indexer(self, key, axis: int, is_setter: bool = False):
20262026
"""
@@ -2030,7 +2030,8 @@ def _convert_to_indexer(self, key, axis: int, is_setter: bool = False):
20302030

20312031
# make need to convert a float key
20322032
if isinstance(key, slice):
2033-
return labels._convert_slice_indexer(key, kind="iloc")
2033+
labels._validate_positional_slice(key)
2034+
return key
20342035

20352036
elif is_float(key):
20362037
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)