From f9df106aee5eceacf85c6105c070bb0076f13bb3 Mon Sep 17 00:00:00 2001 From: Jeremy Schendel Date: Sun, 29 Sep 2019 23:50:46 -0600 Subject: [PATCH 1/3] BUG: Fix RangeIndex.get_indexer for decreasing RangeIndex --- doc/source/whatsnew/v0.25.2.rst | 2 +- pandas/core/indexes/range.py | 5 +++-- pandas/tests/indexes/test_range.py | 8 ++++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/doc/source/whatsnew/v0.25.2.rst b/doc/source/whatsnew/v0.25.2.rst index 14682b706f924..4655aa17f7066 100644 --- a/doc/source/whatsnew/v0.25.2.rst +++ b/doc/source/whatsnew/v0.25.2.rst @@ -49,7 +49,7 @@ Interval Indexing ^^^^^^^^ -- +- Bug in ``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 8783351cc74d1..40e843252e35d 100644 --- a/pandas/core/indexes/range.py +++ b/pandas/core/indexes/range.py @@ -386,8 +386,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 58b98297f00f3..8c34786f70502 100644 --- a/pandas/tests/indexes/test_range.py +++ b/pandas/tests/indexes/test_range.py @@ -416,6 +416,14 @@ def test_get_indexer_backfill(self): expected = np.array([0, 1, 1, 2, 2, 3, 3, 4, 4, 5], dtype=np.intp) tm.assert_numpy_array_equal(indexer, 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)) From 4afb48d0f71ecbe895c3e83658254aaa8372b25d Mon Sep 17 00:00:00 2001 From: jschendel Date: Tue, 1 Oct 2019 13:58:07 -0600 Subject: [PATCH 2/3] add reference --- doc/source/whatsnew/v0.25.2.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v0.25.2.rst b/doc/source/whatsnew/v0.25.2.rst index e8a4eda9a2b23..9613600c7620f 100644 --- a/doc/source/whatsnew/v0.25.2.rst +++ b/doc/source/whatsnew/v0.25.2.rst @@ -50,7 +50,7 @@ Indexing ^^^^^^^^ - Fix regression in :meth:`DataFrame.reindex` not following ``limit`` argument (:issue:`28631`). -- Bug in ``RangeIndex.get_indexer`` for decreasing :class:`RangeIndex` where target values may be improperly identified as missing/present (:issue:`28678`) +- Bug in :meth:`RangeIndex.get_indexer` for decreasing :class:`RangeIndex` where target values may be improperly identified as missing/present (:issue:`28678`) - - From ae482a765ad2e4ae4297ee93cf5cace30b998150 Mon Sep 17 00:00:00 2001 From: Joris Van den Bossche Date: Wed, 2 Oct 2019 08:50:02 +0200 Subject: [PATCH 3/3] Update v0.25.2.rst --- doc/source/whatsnew/v0.25.2.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v0.25.2.rst b/doc/source/whatsnew/v0.25.2.rst index 9613600c7620f..9789c9fce3541 100644 --- a/doc/source/whatsnew/v0.25.2.rst +++ b/doc/source/whatsnew/v0.25.2.rst @@ -50,7 +50,7 @@ Indexing ^^^^^^^^ - Fix regression in :meth:`DataFrame.reindex` not following ``limit`` argument (:issue:`28631`). -- Bug in :meth:`RangeIndex.get_indexer` for decreasing :class:`RangeIndex` where target values may be improperly identified as missing/present (:issue:`28678`) +- Fix regression in :meth:`RangeIndex.get_indexer` for decreasing :class:`RangeIndex` where target values may be improperly identified as missing/present (:issue:`28678`) - -