Skip to content

Commit 84cb75d

Browse files
authored
REF: RangeIndex.delete defer to .difference (#44232)
1 parent a4bf5c3 commit 84cb75d

File tree

2 files changed

+17
-15
lines changed

2 files changed

+17
-15
lines changed

pandas/core/indexes/range.py

+8-15
Original file line numberDiff line numberDiff line change
@@ -807,24 +807,17 @@ def delete(self, loc) -> Index: # type: ignore[override]
807807
return self[1:]
808808
if loc == -1 or loc == len(self) - 1:
809809
return self[:-1]
810+
if len(self) == 3 and (loc == 1 or loc == -2):
811+
return self[::2]
810812

811813
elif lib.is_list_like(loc):
812814
slc = lib.maybe_indices_to_slice(np.asarray(loc, dtype=np.intp), len(self))
813-
if isinstance(slc, slice) and slc.step is not None and slc.step < 0:
814-
rng = range(len(self))[slc][::-1]
815-
slc = slice(rng.start, rng.stop, rng.step)
816-
817-
if isinstance(slc, slice) and slc.step in [1, None]:
818-
# Note: maybe_indices_to_slice will never return a slice
819-
# with 'slc.start is None'; may have slc.stop None in cases
820-
# with negative step
821-
if slc.start == 0:
822-
return self[slc.stop :]
823-
elif slc.stop in [len(self), None]:
824-
return self[: slc.start]
825-
826-
# TODO: more generally, self.difference(self[slc]),
827-
# once _difference is better about retaining RangeIndex
815+
816+
if isinstance(slc, slice):
817+
# defer to RangeIndex._difference, which is optimized to return
818+
# a RangeIndex whenever possible
819+
other = self[slc]
820+
return self.difference(other, sort=False)
828821

829822
return super().delete(loc)
830823

pandas/tests/indexes/ranges/test_range.py

+9
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,15 @@ def test_delete_preserves_rangeindex(self):
178178
result = idx.delete(1)
179179
tm.assert_index_equal(result, expected, exact=True)
180180

181+
def test_delete_preserves_rangeindex_middle(self):
182+
idx = Index(range(3), name="foo")
183+
result = idx.delete(1)
184+
expected = idx[::2]
185+
tm.assert_index_equal(result, expected, exact=True)
186+
187+
result = idx.delete(-2)
188+
tm.assert_index_equal(result, expected, exact=True)
189+
181190
def test_delete_preserves_rangeindex_list_at_end(self):
182191
idx = RangeIndex(0, 6, 1)
183192

0 commit comments

Comments
 (0)