Skip to content

Commit 5f33a72

Browse files
Backport PR #45377: REGR: DataFrame.reset_index with empty RangeIndex (#45394)
Co-authored-by: jbrockmendel <[email protected]>
1 parent 638a42f commit 5f33a72

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
@@ -2080,8 +2080,14 @@ def _drop_level_numbers(self, levnums: list[int]):
20802080

20812081
if len(lev) == 0:
20822082
# If lev is empty, lev.take will fail GH#42055
2083-
res_values = algos.take(lev._values, new_codes[0], allow_fill=True)
2084-
result = type(lev)._simple_new(res_values, name=new_names[0])
2083+
if len(new_codes[0]) == 0:
2084+
# GH#45230 preserve RangeIndex here
2085+
# see test_reset_index_empty_rangeindex
2086+
result = lev[:0]
2087+
else:
2088+
res_values = algos.take(lev._values, new_codes[0], allow_fill=True)
2089+
# _constructor instead of type(lev) for RangeIndex compat GH#35230
2090+
result = lev._constructor._simple_new(res_values, name=new_names[0])
20852091
else:
20862092
# set nan if needed
20872093
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)