Skip to content

BUG: .reset_index() should raise with an invalid level name (GH20925) #21016

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 17 commits into from
May 18, 2018
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 a non-named level (:issue:`20925`)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't get the "a non-named level". Wouldn't it be "an invalid level name"?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed. Done.

-

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)