def mi_intersection(left: pd.MultiIndex, right: pd.MultiIndex) -> pd.MultiIndex: # pragma: no cover """Intersection of MultiIndexes, preserving order. Fix https://github.com/pandas-dev/pandas/issues/31325 """ if left.equals(right): return left lvals = left._ndarray_values rvals = right._ndarray_values uniq_tuples = None # flag whether _inner_indexer was successful if left.is_monotonic and right.is_monotonic: try: uniq_tuples = left._inner_indexer(lvals, rvals)[0] except TypeError: pass # noqa:WPS420 if uniq_tuples is None: right_uniq = set(rvals) seen: Set[Tuple] = set() uniq_tuples = [ x for x in lvals if x in right_uniq and not (x in seen or seen.add(x)) # type: ignore ] names = left.names if left.names == right.names else None if len(uniq_tuples) == 0: return pd.MultiIndex( levels=left.levels, codes=[[]] * left.nlevels, names=names, verify_integrity=False, ) return pd.MultiIndex.from_tuples(uniq_tuples, sortorder=0, names=names)