diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index dc2abfb0cb6eb..cc838cd09b949 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -704,22 +704,23 @@ def _set_levels( # This is NOT part of the levels property because it should be # externally not allowed to set levels. User beware if you change # _levels directly - if validate and len(levels) == 0: - raise ValueError("Must set non-zero number of levels.") - if validate and level is None and len(levels) != self.nlevels: - raise ValueError("Length of levels must match number of levels.") - if validate and level is not None and len(levels) != len(level): - raise ValueError("Length of levels must match length of level.") + if validate: + if len(levels) == 0: + raise ValueError("Must set non-zero number of levels.") + if level is None and len(levels) != self.nlevels: + raise ValueError("Length of levels must match number of levels.") + if level is not None and len(levels) != len(level): + raise ValueError("Length of levels must match length of level.") if level is None: new_levels = FrozenList( ensure_index(lev, copy=copy)._shallow_copy() for lev in levels ) else: - level = [self._get_level_number(l) for l in level] + level_numbers = [self._get_level_number(lev) for lev in level] new_levels = list(self._levels) - for l, v in zip(level, levels): - new_levels[l] = ensure_index(v, copy=copy)._shallow_copy() + for lev_num, lev in zip(level_numbers, levels): + new_levels[lev_num] = ensure_index(lev, copy=copy)._shallow_copy() new_levels = FrozenList(new_levels) if verify_integrity: @@ -825,10 +826,11 @@ def labels(self): def _set_codes( self, codes, level=None, copy=False, validate=True, verify_integrity=False ): - if validate and level is None and len(codes) != self.nlevels: - raise ValueError("Length of codes must match number of levels") - if validate and level is not None and len(codes) != len(level): - raise ValueError("Length of codes must match length of levels.") + if validate: + if level is None and len(codes) != self.nlevels: + raise ValueError("Length of codes must match number of levels") + if level is not None and len(codes) != len(level): + raise ValueError("Length of codes must match length of levels.") if level is None: new_codes = FrozenList( @@ -836,11 +838,11 @@ def _set_codes( for lev, level_codes in zip(self._levels, codes) ) else: - level = [self._get_level_number(l) for l in level] + level_numbers = [self._get_level_number(lev) for lev in level] new_codes = list(self._codes) - for lev_idx, level_codes in zip(level, codes): - lev = self.levels[lev_idx] - new_codes[lev_idx] = _ensure_frozen( + for lev_num, level_codes in zip(level_numbers, codes): + lev = self.levels[lev_num] + new_codes[lev_num] = _ensure_frozen( level_codes, lev, copy=copy )._shallow_copy() new_codes = FrozenList(new_codes) @@ -1253,17 +1255,18 @@ def _set_names(self, names, level=None, validate=True): raise ValueError("Names should be list-like for a MultiIndex") names = list(names) - if validate and level is not None and len(names) != len(level): - raise ValueError("Length of names must match length of level.") - if validate and level is None and len(names) != self.nlevels: - raise ValueError( - "Length of names must match number of levels in MultiIndex." - ) + if validate: + if level is not None and len(names) != len(level): + raise ValueError("Length of names must match length of level.") + if level is None and len(names) != self.nlevels: + raise ValueError( + "Length of names must match number of levels in MultiIndex." + ) if level is None: level = range(self.nlevels) else: - level = [self._get_level_number(l) for l in level] + level = [self._get_level_number(lev) for lev in level] # set the name for lev, name in zip(level, names):