Skip to content

Commit e3ff3d9

Browse files
authored
REGR: DataFrame.reset_index with empty RangeIndex (#45377)
1 parent 39b7a6d commit e3ff3d9

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

pandas/core/indexes/base.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -2083,8 +2083,14 @@ def _drop_level_numbers(self, levnums: list[int]):
20832083

20842084
if len(lev) == 0:
20852085
# If lev is empty, lev.take will fail GH#42055
2086-
res_values = algos.take(lev._values, new_codes[0], allow_fill=True)
2087-
result = type(lev)._simple_new(res_values, name=new_names[0])
2086+
if len(new_codes[0]) == 0:
2087+
# GH#45230 preserve RangeIndex here
2088+
# see test_reset_index_empty_rangeindex
2089+
result = lev[:0]
2090+
else:
2091+
res_values = algos.take(lev._values, new_codes[0], allow_fill=True)
2092+
# _constructor instead of type(lev) for RangeIndex compat GH#35230
2093+
result = lev._constructor._simple_new(res_values, name=new_names[0])
20882094
else:
20892095
# set nan if needed
20902096
mask = new_codes[0] == -1

pandas/tests/frame/methods/test_reset_index.py

+11
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,17 @@
2828

2929

3030
class TestResetIndex:
31+
def test_reset_index_empty_rangeindex(self):
32+
# GH#45230
33+
df = DataFrame(
34+
columns=["brand"], dtype=np.int64, index=RangeIndex(0, 0, 1, name="foo")
35+
)
36+
37+
df2 = df.set_index([df.index, "brand"])
38+
39+
result = df2.reset_index([1], drop=True)
40+
tm.assert_frame_equal(result, df[[]], check_index_type=True)
41+
3142
def test_set_reset(self):
3243

3344
idx = Index([2 ** 63, 2 ** 63 + 5, 2 ** 63 + 10], name="foo")

0 commit comments

Comments
 (0)