diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 064d052806e27..0d30c1665df34 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -881,16 +881,7 @@ def set_levels(self, levels, level=None, inplace=None, verify_integrity=True): if is_list_like(levels) and not isinstance(levels, Index): levels = list(levels) - if level is not None and not is_list_like(level): - if not is_list_like(levels): - raise TypeError("Levels must be list-like") - if is_list_like(levels[0]): - raise TypeError("Levels must be list-like") - level = [level] - levels = [levels] - elif level is None or is_list_like(level): - if not is_list_like(levels) or not is_list_like(levels[0]): - raise TypeError("Levels must be list of lists-like") + level, levels = _require_listlike(level, levels, "Levels") if inplace: idx = self @@ -1050,16 +1041,7 @@ def set_codes(self, codes, level=None, inplace=None, verify_integrity=True): else: inplace = False - if level is not None and not is_list_like(level): - if not is_list_like(codes): - raise TypeError("Codes must be list-like") - if is_list_like(codes[0]): - raise TypeError("Codes must be list-like") - level = [level] - codes = [codes] - elif level is None or is_list_like(level): - if not is_list_like(codes) or not is_list_like(codes[0]): - raise TypeError("Codes must be list of lists-like") + level, codes = _require_listlike(level, codes, "Codes") if inplace: idx = self @@ -3870,3 +3852,20 @@ def _coerce_indexer_frozen(array_like, categories, copy: bool = False) -> np.nda array_like = array_like.copy() array_like.flags.writeable = False return array_like + + +def _require_listlike(level, arr, arrname: str): + """ + Ensure that level is either None or listlike, and arr is list-of-listlike. + """ + if level is not None and not is_list_like(level): + if not is_list_like(arr): + raise TypeError(f"{arrname} must be list-like") + if is_list_like(arr[0]): + raise TypeError(f"{arrname} must be list-like") + level = [level] + arr = [arr] + elif level is None or is_list_like(level): + if not is_list_like(arr) or not is_list_like(arr[0]): + raise TypeError(f"{arrname} must be list of lists-like") + return level, arr