From 73533773201970dd3377fa1246f4930c657d1806 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Mon, 10 Feb 2020 10:07:00 -0800 Subject: [PATCH] REF: make Series/DataFrame _slice always positional --- pandas/core/generic.py | 6 ++---- pandas/core/indexing.py | 4 ++-- pandas/core/series.py | 14 +++++++------- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 004b92176f030..dfafb1057a543 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -3498,13 +3498,11 @@ def _iget_item_cache(self, item): def _box_item_values(self, key, values): raise AbstractMethodError(self) - def _slice( - self: FrameOrSeries, slobj: slice, axis=0, kind: str = "getitem" - ) -> FrameOrSeries: + def _slice(self: FrameOrSeries, slobj: slice, axis=0) -> FrameOrSeries: """ Construct a slice of this container. - kind parameter is maintained for compatibility with Series slicing. + Slicing with this method is *always* positional. """ axis = self._get_block_manager_axis(axis) result = self._constructor(self._data.get_slice(slobj, axis=axis)) diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index b2e5d04247e81..7370aea7d928a 100755 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -1627,7 +1627,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int): ) if isinstance(indexer, slice): - return self.obj._slice(indexer, axis=axis, kind="iloc") + return self.obj._slice(indexer, axis=axis) else: # DatetimeIndex overrides Index.slice_indexer and may # return a DatetimeIndex instead of a slice object. @@ -2034,7 +2034,7 @@ def _get_slice_axis(self, slice_obj: slice, axis: int): labels = obj._get_axis(axis) labels._validate_positional_slice(slice_obj) - return self.obj._slice(slice_obj, axis=axis, kind="iloc") + return self.obj._slice(slice_obj, axis=axis) def _convert_to_indexer(self, key, axis: int, is_setter: bool = False): """ diff --git a/pandas/core/series.py b/pandas/core/series.py index 34ebbaf79e5e9..7d74d32bf5e14 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -840,12 +840,9 @@ def _ixs(self, i: int, axis: int = 0): """ return self._values[i] - def _slice(self, slobj: slice, axis: int = 0, kind: str = "getitem") -> "Series": - assert kind in ["getitem", "iloc"] - if kind == "getitem": - # If called from getitem, we need to determine whether - # this slice is positional or label-based. - slobj = self.index._convert_slice_indexer(slobj, kind="getitem") + def _slice(self, slobj: slice, axis: int = 0) -> "Series": + # axis kwarg is retained for compat with NDFrame method + # _slice is *always* positional return self._get_values(slobj) def __getitem__(self, key): @@ -889,7 +886,10 @@ def __getitem__(self, key): def _get_with(self, key): # other: fancy integer or otherwise if isinstance(key, slice): - return self._slice(key, kind="getitem") + # _convert_slice_indexer to determing if this slice is positional + # or label based, and if the latter, convert to positional + slobj = self.index._convert_slice_indexer(key, kind="getitem") + return self._slice(slobj) elif isinstance(key, ABCDataFrame): raise TypeError( "Indexing a Series with DataFrame is not "