Skip to content

Commit 017dafe

Browse files
committed
PERF: Return RangeIndex from RangeIndex.reindex when possible
1 parent 737d390 commit 017dafe

File tree

3 files changed

+15
-0
lines changed

3 files changed

+15
-0
lines changed

doc/source/whatsnew/v3.0.0.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ Performance improvements
252252
- Performance improvement in :meth:`Index.take` when ``indices`` is a full range indexer from zero to length of index (:issue:`56806`)
253253
- Performance improvement in :meth:`MultiIndex.equals` for equal length indexes (:issue:`56990`)
254254
- Performance improvement in :meth:`RangeIndex.append` when appending the same index (:issue:`57252`)
255+
- Performance improvement in :meth:`RangeIndex.reindex` returning a :class:`RangeIndex` instead of a :class:`Index` when possible. (:issue:`?`)
255256
- Performance improvement in :meth:`RangeIndex.take` returning a :class:`RangeIndex` instead of a :class:`Index` when possible. (:issue:`57445`)
256257
- Performance improvement in indexing operations for string dtypes (:issue:`56997`)
257258
- :meth:`Series.str.extract` returns a :class:`RangeIndex` columns instead of an :class:`Index` column when possible (:issue:`?``)

pandas/core/indexes/range.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,10 @@ def _view(self) -> Self:
487487
result._cache = self._cache
488488
return result
489489

490+
def _wrap_reindex_result(self, target, indexer, preserve_names: bool):
491+
target = self._shallow_copy(target._values)
492+
return super()._wrap_reindex_result(target, indexer, preserve_names)
493+
490494
@doc(Index.copy)
491495
def copy(self, name: Hashable | None = None, deep: bool = False) -> Self:
492496
name = self._validate_names(name=name, deep=deep)[0]

pandas/tests/indexes/ranges/test_range.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,16 @@ def test_range_index_rsub_by_const(self):
608608
tm.assert_index_equal(result, expected)
609609

610610

611+
def test_reindex_returns_rangeindex():
612+
ri = RangeIndex(2, name="foo")
613+
result, result_indexer = ri.reindex([1, 2, 3])
614+
expected = RangeIndex(1, 4, name="foo")
615+
tm.assert_index_equal(result, expected, exact=True)
616+
617+
expected_indexer = np.array([1, -1, -1])
618+
tm.assert_numpy_array_equal(result_indexer, expected_indexer)
619+
620+
611621
def test_take_return_rangeindex():
612622
ri = RangeIndex(5, name="foo")
613623
result = ri.take([])

0 commit comments

Comments
 (0)