diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 862b6f0e43d50..22ab2bff4cb09 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -2080,8 +2080,14 @@ def _drop_level_numbers(self, levnums: list[int]): if len(lev) == 0: # If lev is empty, lev.take will fail GH#42055 - res_values = algos.take(lev._values, new_codes[0], allow_fill=True) - result = type(lev)._simple_new(res_values, name=new_names[0]) + if len(new_codes[0]) == 0: + # GH#45230 preserve RangeIndex here + # see test_reset_index_empty_rangeindex + result = lev[:0] + else: + res_values = algos.take(lev._values, new_codes[0], allow_fill=True) + # _constructor instead of type(lev) for RangeIndex compat GH#35230 + result = lev._constructor._simple_new(res_values, name=new_names[0]) else: # set nan if needed mask = new_codes[0] == -1 diff --git a/pandas/tests/frame/methods/test_reset_index.py b/pandas/tests/frame/methods/test_reset_index.py index a707bbb377f24..8130c4fa41c12 100644 --- a/pandas/tests/frame/methods/test_reset_index.py +++ b/pandas/tests/frame/methods/test_reset_index.py @@ -28,6 +28,17 @@ class TestResetIndex: + def test_reset_index_empty_rangeindex(self): + # GH#45230 + df = DataFrame( + columns=["brand"], dtype=np.int64, index=RangeIndex(0, 0, 1, name="foo") + ) + + df2 = df.set_index([df.index, "brand"]) + + result = df2.reset_index([1], drop=True) + tm.assert_frame_equal(result, df[[]], check_index_type=True) + def test_set_reset(self): idx = Index([2 ** 63, 2 ** 63 + 5, 2 ** 63 + 10], name="foo")