diff --git a/doc/source/whatsnew/v1.4.0.rst b/doc/source/whatsnew/v1.4.0.rst index 166ea2f0d4164..9859f12a34621 100644 --- a/doc/source/whatsnew/v1.4.0.rst +++ b/doc/source/whatsnew/v1.4.0.rst @@ -167,7 +167,7 @@ Missing MultiIndex ^^^^^^^^^^ -- +- Bug in :meth:`MultiIndex.reindex` when passing a ``level`` that corresponds to an ``ExtensionDtype`` level (:issue:`42043`) - I/O diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index 02961bc98ec61..af5d704549c50 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -2503,9 +2503,7 @@ def reindex( target = ibase.ensure_has_len(target) if len(target) == 0 and not isinstance(target, Index): idx = self.levels[level] - attrs = idx._get_attributes_dict() - attrs.pop("freq", None) # don't preserve freq - target = type(idx)._simple_new(np.empty(0, dtype=idx.dtype), **attrs) + target = idx[:0] else: target = ensure_index(target) target, indexer, _ = self._join_level( diff --git a/pandas/tests/indexes/multi/test_reindex.py b/pandas/tests/indexes/multi/test_reindex.py index 38ff6efec40c9..d9c77c5bdcd60 100644 --- a/pandas/tests/indexes/multi/test_reindex.py +++ b/pandas/tests/indexes/multi/test_reindex.py @@ -84,6 +84,13 @@ def test_reindex_lvl_preserves_type_if_target_is_empty_list_or_array(): assert idx.reindex([], level=0)[0].levels[0].dtype.type == np.int64 assert idx.reindex([], level=1)[0].levels[1].dtype.type == np.object_ + # case with EA levels + cat = pd.Categorical(["foo", "bar"]) + dti = pd.date_range("2016-01-01", periods=2, tz="US/Pacific") + mi = MultiIndex.from_product([cat, dti]) + assert mi.reindex([], level=0)[0].levels[0].dtype == cat.dtype + assert mi.reindex([], level=1)[0].levels[1].dtype == dti.dtype + def test_reindex_base(idx): idx = idx