Skip to content

Commit 181e22b

Browse files
committed
consolidate code and split up tests for set_levels
1 parent 4d1655e commit 181e22b

File tree

2 files changed

+42
-23
lines changed

2 files changed

+42
-23
lines changed

pandas/core/indexes/multi.py

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,12 @@ def _set_levels(self, levels, level=None, copy=False, validate=True,
163163
# externally not allowed to set levels. User beware if you change
164164
# _levels directly
165165
if validate and len(levels) == 0:
166-
raise ValueError('Must set non-zero number of levels.')
166+
if is_list_like(level):
167+
raise ValueError('Must set non-zero number of levels with '
168+
'current value of level')
169+
else:
170+
assert(False)
171+
raise ValueError('Must set non-zero number of levels.')
167172
if validate and level is None and len(levels) != self.nlevels:
168173
raise ValueError('Length of levels must match number of levels.')
169174
if validate and level is not None and len(levels) != len(level):
@@ -235,26 +240,8 @@ def set_levels(self, levels, level=None, inplace=False,
235240
labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
236241
names=[u'foo', u'bar'])
237242
"""
238-
239-
level_list_like = level is None or is_list_like(level)
240-
levels_list_like = (is_list_like(levels) and
241-
all(is_list_like(x) for x in levels) and
242-
levels != [] )
243-
244-
if level_list_like:
245-
# level is a list-like object of scalars
246-
levels_error = ("`levels` and `level` are incompatible. "
247-
"When `level` is list-like, `levels` must be a "
248-
"list-like object containing list-like objects")
249-
if not levels_list_like:
250-
raise TypeError(levels_error)
251-
elif not level_list_like:
252-
# level is a scalar
253-
levels_error = ("`levels` and `level` are incompatible. "
254-
"When `level` is a scalar, `levels` must be a "
255-
" list-like object of scalars.")
256-
if levels_list_like:
257-
raise TypeError(levels_error)
243+
if not (level is None or is_list_like(level)):
244+
# level is a scalar, not list-like
258245
level = [level]
259246
levels = [levels]
260247

pandas/tests/indexing/test_multiindex.py

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ def test_xs_multiindex(self):
428428
expected.columns = expected.columns.droplevel('lvl1')
429429
tm.assert_frame_equal(result, expected)
430430

431-
def test_set_level_checkall(self):
431+
def test_set_level_with_level_as_default(self):
432432

433433
idx = MultiIndex.from_tuples([(1, u'one'), (1, u'two'),
434434
(2, u'one'), (2, u'two')],
@@ -439,32 +439,64 @@ def test_set_level_checkall(self):
439439
names=[u'foo', u'bar'])
440440
tm.assert_index_equal(result, expected)
441441

442+
def test_set_level_with_level_as_int(self):
443+
444+
idx = MultiIndex.from_tuples([(1, u'one'), (1, u'two'),
445+
(2, u'one'), (2, u'two')],
446+
names=['foo', 'bar'])
442447
result = idx.set_levels(['a', 'b'], level=0)
443448
expected = MultiIndex(levels=[[u'a', u'b'], [u'one', u'two']],
444449
labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
445450
names=[u'foo', u'bar'])
446451
tm.assert_index_equal(result, expected)
447452

453+
def test_set_level_with_level_as_string(self):
454+
455+
idx = MultiIndex.from_tuples([(1, u'one'), (1, u'two'),
456+
(2, u'one'), (2, u'two')],
457+
names=['foo', 'bar'])
448458
result = idx.set_levels(['a', 'b'], level='bar')
449459
expected = MultiIndex(levels=[[1, 2], [u'a', u'b']],
450460
labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
451461
names=[u'foo', u'bar'])
452462
tm.assert_index_equal(result, expected)
453463

464+
def test_set_level_with_level_as_list(self):
465+
466+
idx = MultiIndex.from_tuples([(1, u'one'), (1, u'two'),
467+
(2, u'one'), (2, u'two')],
468+
names=['foo', 'bar'])
454469
result = idx.set_levels([['a', 'b'], [1, 2]], level=[0, 1])
455470
expected = MultiIndex(levels=[[u'a', u'b'], [1, 2]],
456471
labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
457472
names=[u'foo', u'bar'])
458473
tm.assert_index_equal(result, expected)
459474

475+
def test_set_levels_with_empty_list_treated_as_scalar(self):
476+
477+
idx = MultiIndex(levels=[['a', 'b'], [1, 2]], labels=[[], []])
478+
result = idx.set_levels([], level=0)
479+
expected = MultiIndex(levels=[[], [1, 2]], labels=[[], []])
480+
tm.assert_index_equal(result, expected)
481+
482+
# def test_set_levels_with_empty_list_treated_as_list_like(self):
483+
# # i dont' think this should pass
484+
# idx = MultiIndex(levels=[['a', 'b'], [1, 2]], labels=[[], []])
485+
# result = idx.set_levels([], level=[0,1])
486+
# expected = MultiIndex(levels=[[], []], labels=[[], []])
487+
# tm.assert_index_equal(result, expected)
488+
489+
def test_set_level_assigning_empty_level(self):
490+
491+
# GH16147
460492
# setting empty levels are allowed
461493
idx = MultiIndex(levels=[['L1'], ['L2']], labels=[[], []],
462494
names=['a', 'b'])
463495
result = idx.set_levels([], level='a')
464496
expected = MultiIndex(levels=[[], ['L2']], labels=[[], []],
465497
names=['a', 'b'])
466498
tm.assert_index_equal(result, expected)
467-
499+
468500
idx = MultiIndex(levels=[['L1'], ['L2']], labels=[[], []],
469501
names=['a', 'b'])
470502
result = idx.set_levels([[], []], level=['a', 'b'])

0 commit comments

Comments
 (0)