From 8b8987ee3fe344077c9f28a21bacfa811375aa5b Mon Sep 17 00:00:00 2001 From: Brock Date: Wed, 23 Dec 2020 20:13:07 -0800 Subject: [PATCH] REF: share Index.difference --- pandas/core/indexes/base.py | 5 +++ pandas/core/indexes/multi.py | 35 +------------------ pandas/core/indexes/period.py | 10 ------ pandas/tests/indexes/datetimes/test_setops.py | 3 +- pandas/tests/indexes/multi/test_setops.py | 4 ++- pandas/tests/indexes/period/test_setops.py | 3 +- 6 files changed, 13 insertions(+), 47 deletions(-) diff --git a/pandas/core/indexes/base.py b/pandas/core/indexes/base.py index 8d48a6277d412..edb8cd57b31bd 100644 --- a/pandas/core/indexes/base.py +++ b/pandas/core/indexes/base.py @@ -2906,8 +2906,13 @@ def difference(self, other, sort=None): other, result_name = self._convert_can_do_setop(other) if self.equals(other): + # Note: we do not (yet) sort even if sort=None GH#24959 return self[:0].rename(result_name) + if len(other) == 0: + # Note: we do not (yet) sort even if sort=None GH#24959 + return self.rename(result_name) + result = self._difference(other, sort=sort) return self._wrap_setop_result(other, result) diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index c7be66b596246..3c7c0fdc45d70 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -3676,42 +3676,9 @@ def _intersection(self, other, sort=False): zip(*uniq_tuples), sortorder=0, names=result_names ) - def difference(self, other, sort=None): - """ - Compute set difference of two MultiIndex objects - - Parameters - ---------- - other : MultiIndex - sort : False or None, default None - Sort the resulting MultiIndex if possible - - .. versionadded:: 0.24.0 - - .. versionchanged:: 0.24.1 - - Changed the default value from ``True`` to ``None`` - (without change in behaviour). - - Returns - ------- - diff : MultiIndex - """ - self._validate_sort_keyword(sort) - self._assert_can_do_setop(other) + def _difference(self, other, sort): other, result_names = self._convert_can_do_setop(other) - if len(other) == 0: - return self.rename(result_names) - - if self.equals(other): - return MultiIndex( - levels=self.levels, - codes=[[]] * self.nlevels, - names=result_names, - verify_integrity=False, - ) - this = self._get_unique_index() indexer = this.get_indexer(other) diff --git a/pandas/core/indexes/period.py b/pandas/core/indexes/period.py index 4d48bc0d51912..49acb7b5592cb 100644 --- a/pandas/core/indexes/period.py +++ b/pandas/core/indexes/period.py @@ -635,16 +635,6 @@ def _setop(self, other, sort, opname: str): def _intersection(self, other, sort=False): return self._setop(other, sort, opname="intersection") - def difference(self, other, sort=None): - self._validate_sort_keyword(sort) - self._assert_can_do_setop(other) - other, result_name = self._convert_can_do_setop(other) - - if self.equals(other): - return self[:0].rename(result_name) - - return self._difference(other, sort=sort) - def _difference(self, other, sort): if is_object_dtype(other): diff --git a/pandas/tests/indexes/datetimes/test_setops.py b/pandas/tests/indexes/datetimes/test_setops.py index 93772e2c27a82..c7632c3c5c455 100644 --- a/pandas/tests/indexes/datetimes/test_setops.py +++ b/pandas/tests/indexes/datetimes/test_setops.py @@ -326,7 +326,8 @@ def test_difference(self, tz, sort): (rng3, other3, expected3), ]: result_diff = rng.difference(other, sort) - if sort is None: + if sort is None and len(other): + # We dont sort (yet?) when empty GH#24959 expected = expected.sort_values() tm.assert_index_equal(result_diff, expected) diff --git a/pandas/tests/indexes/multi/test_setops.py b/pandas/tests/indexes/multi/test_setops.py index 9a7ff78bae3db..e8d5baaef42d4 100644 --- a/pandas/tests/indexes/multi/test_setops.py +++ b/pandas/tests/indexes/multi/test_setops.py @@ -294,7 +294,9 @@ def test_intersection(idx, sort): # assert result.equals(tuples) -@pytest.mark.parametrize("method", ["intersection", "union"]) +@pytest.mark.parametrize( + "method", ["intersection", "union", "difference", "symmetric_difference"] +) def test_setop_with_categorical(idx, sort, method): other = idx.to_flat_index().astype("category") res_names = [None] * idx.nlevels diff --git a/pandas/tests/indexes/period/test_setops.py b/pandas/tests/indexes/period/test_setops.py index 04acfdc65dbc0..40d1263ff70cd 100644 --- a/pandas/tests/indexes/period/test_setops.py +++ b/pandas/tests/indexes/period/test_setops.py @@ -318,7 +318,8 @@ def test_difference(self, sort): (rng7, other7, expected7), ]: result_difference = rng.difference(other, sort=sort) - if sort is None: + if sort is None and len(other): + # We dont sort (yet?) when empty GH#24959 expected = expected.sort_values() tm.assert_index_equal(result_difference, expected)