From 9c23545b2f10b1661f7549628d09e347a57da65d Mon Sep 17 00:00:00 2001 From: Jeremy Schendel Date: Wed, 2 Oct 2019 00:50:50 -0600 Subject: [PATCH] BUG: Fix RangeIndex.get_indexer for decreasing RangeIndex (#28680) --- doc/source/whatsnew/v0.25.2.rst | 1 + pandas/core/indexes/range.py | 5 +++-- pandas/tests/indexes/test_range.py | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/doc/source/whatsnew/v0.25.2.rst b/doc/source/whatsnew/v0.25.2.rst index f904d69d6421b..9789c9fce3541 100644 --- a/doc/source/whatsnew/v0.25.2.rst +++ b/doc/source/whatsnew/v0.25.2.rst @@ -50,6 +50,7 @@ Indexing ^^^^^^^^ - Fix regression in :meth:`DataFrame.reindex` not following ``limit`` argument (:issue:`28631`). +- Fix regression in :meth:`RangeIndex.get_indexer` for decreasing :class:`RangeIndex` where target values may be improperly identified as missing/present (:issue:`28678`) - - diff --git a/pandas/core/indexes/range.py b/pandas/core/indexes/range.py index 43445a0d5d5a2..6e2d500f4c5ab 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -388,8 +388,9 @@ def get_indexer(self, target, method=None, limit=None, tolerance=None): if self.step > 0: start, stop, step = self.start, self.stop, self.step else: - # Work on reversed range for simplicity: - start, stop, step = (self.stop - self.step, self.start + 1, -self.step) + # GH 28678: work on reversed range for simplicity + reverse = self._range[::-1] + start, stop, step = reverse.start, reverse.stop, reverse.step target_array = np.asarray(target) if not (is_integer_dtype(target_array) and target_array.ndim == 1): diff --git a/pandas/tests/indexes/test_range.py b/pandas/tests/indexes/test_range.py index 7e08a5deaff7a..627c5cc56e010 100644 --- a/pandas/tests/indexes/test_range.py +++ b/pandas/tests/indexes/test_range.py @@ -424,6 +424,14 @@ def test_get_indexer_limit(self): expected = np.array([0, 1, 2, 3, 3, -1], dtype=np.intp) tm.assert_numpy_array_equal(result, expected) + @pytest.mark.parametrize("stop", [0, -1, -2]) + def test_get_indexer_decreasing(self, stop): + # GH 28678 + index = RangeIndex(7, stop, -3) + result = index.get_indexer(range(9)) + expected = np.array([-1, 2, -1, -1, 1, -1, -1, 0, -1], dtype=np.intp) + tm.assert_numpy_array_equal(result, expected) + def test_join_outer(self): # join with Int64Index other = Int64Index(np.arange(25, 14, -1))