Skip to content

Commit e10759d

Browse files
committed
BUG: raise when wrong level name is passed to "unstack"
closes pandas-dev#18303
1 parent 61362be commit e10759d

File tree

3 files changed

+15
-1
lines changed

3 files changed

+15
-1
lines changed

pandas/core/indexes/base.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -1524,7 +1524,9 @@ def _validate_index_level(self, level):
15241524
"Too many levels:" " Index has only 1 level, not %d" % (level + 1)
15251525
)
15261526
elif level != self.name:
1527-
raise KeyError("Level %s must be same as name (%s)" % (level, self.name))
1527+
raise KeyError(
1528+
'Level ("%s") is different from index name ("%s")' % (level, self.name)
1529+
)
15281530

15291531
def _get_level_number(self, level):
15301532
self._validate_index_level(level)

pandas/core/reshape/reshape.py

+2
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,8 @@ def unstack(obj, level, fill_value=None):
402402
else:
403403
level = level[0]
404404

405+
level = obj.index._get_level_number(level)
406+
405407
if isinstance(obj, DataFrame):
406408
if isinstance(obj.index, MultiIndex):
407409
return _unstack_frame(obj, level, fill_value=fill_value)

pandas/tests/test_multilevel.py

+10
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,16 @@ def test_stack_unstack_preserve_names(self):
524524
restacked = unstacked.stack()
525525
assert restacked.index.names == self.frame.index.names
526526

527+
@pytest.mark.parametrize("method", ['stack', 'unstack'])
528+
def test_stack_unstack_wrong_level_name(self, method):
529+
# GH 18303 - wrong level name should raise
530+
531+
# A frame with flat axes:
532+
df = self.frame.loc['foo']
533+
534+
with pytest.raises(KeyError, match="is different from index name"):
535+
getattr(df, method)('mistake')
536+
527537
def test_unstack_level_name(self):
528538
result = self.frame.unstack("second")
529539
expected = self.frame.unstack(level=1)

0 commit comments

Comments
 (0)