diff --git a/doc/source/whatsnew/v1.6.0.rst b/doc/source/whatsnew/v1.6.0.rst index 405b8cc0a5ded..9cf12c0c8249f 100644 --- a/doc/source/whatsnew/v1.6.0.rst +++ b/doc/source/whatsnew/v1.6.0.rst @@ -175,6 +175,7 @@ Missing MultiIndex ^^^^^^^^^^ +- Bug in :class:`MultiIndex.set_levels` raising ``IndexError`` when setting empty level (:issue:`48636`) - Bug in :meth:`MultiIndex.unique` losing extension array dtype (:issue:`48335`) - Bug in :meth:`MultiIndex.union` losing extension array (:issue:`48498`, :issue:`48505`) - Bug in :meth:`MultiIndex.append` not checking names for equality (:issue:`48288`) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index dd63ea94d5211..cb4ed2e58adef 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -4003,7 +4003,7 @@ def _require_listlike(level, arr, arrname: str): 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]): + if len(arr) > 0 and is_list_like(arr[0]): raise TypeError(f"{arrname} must be list-like") level = [level] arr = [arr] diff --git a/pandas/tests/indexes/multi/test_get_set.py b/pandas/tests/indexes/multi/test_get_set.py index 42cf0168f6599..3c64f7997b584 100644 --- a/pandas/tests/indexes/multi/test_get_set.py +++ b/pandas/tests/indexes/multi/test_get_set.py @@ -476,6 +476,14 @@ def test_set_levels_pos_args_deprecation(): tm.assert_index_equal(result, expected) +def test_set_empty_level(): + # GH#48636 + midx = MultiIndex.from_arrays([[]], names=["A"]) + result = midx.set_levels(pd.DatetimeIndex([]), level=0) + expected = MultiIndex.from_arrays([pd.DatetimeIndex([])], names=["A"]) + tm.assert_index_equal(result, expected) + + def test_set_codes_pos_args_depreciation(idx): # https://github.com/pandas-dev/pandas/issues/41485 msg = (