Skip to content
Merged
2 changes: 1 addition & 1 deletion doc/source/whatsnew/v0.23.1.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ Conversion
Indexing
^^^^^^^^

-
- Bug in :meth:`Series.reset_index` where appropriate error was not raised with an invalid level name (:issue:`20925`)
-

I/O
Expand Down
7 changes: 4 additions & 3 deletions pandas/core/series.py
Original file line number Diff line number Diff line change
Expand Up @@ -1195,12 +1195,13 @@ def reset_index(self, level=None, drop=False, name=None, inplace=False):
inplace = validate_bool_kwarg(inplace, 'inplace')
if drop:
new_index = com._default_index(len(self))
if level is not None and isinstance(self.index, MultiIndex):
if level is not None:
if not isinstance(level, (tuple, list)):
level = [level]
level = [self.index._get_level_number(lev) for lev in level]
if len(level) < len(self.index.levels):
new_index = self.index.droplevel(level)
if isinstance(self.index, MultiIndex):
if len(level) < self.index.nlevels:
new_index = self.index.droplevel(level)

if inplace:
self.index = new_index
Expand Down
20 changes: 20 additions & 0 deletions pandas/tests/series/test_alter_axes.py
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,11 @@ def test_reset_index_level(self):
with tm.assert_raises_regex(IndexError, 'Too many levels'):
s.reset_index(level=[0, 1, 2])

# Check that .reset_index([],drop=True) doesn't fail
result = pd.Series(range(4)).reset_index([], drop=True)
expected = pd.Series(range(4))
assert_series_equal(result, expected)

def test_reset_index_range(self):
# GH 12071
s = pd.Series(range(2), name='A', dtype='int64')
Expand Down Expand Up @@ -275,3 +280,18 @@ def test_set_axis_prior_to_deprecation_signature(self):
with tm.assert_produces_warning(FutureWarning):
result = s.set_axis(0, list('abcd'), inplace=False)
tm.assert_series_equal(result, expected)

def test_reset_index_drop_errors(self):
# GH 20925

# KeyError raised for series index when passed level name is missing
s = pd.Series(range(4))
with tm.assert_raises_regex(KeyError, 'must be same as name'):
s.reset_index('wrong', drop=True)
with tm.assert_raises_regex(KeyError, 'must be same as name'):
s.reset_index('wrong')

# KeyError raised for series when level to be dropped is missing
s = pd.Series(range(4), index=pd.MultiIndex.from_product([[1, 2]] * 2))
with tm.assert_raises_regex(KeyError, 'not found'):
s.reset_index('wrong', drop=True)