Skip to content

Commit d8b5fac

Browse files
authored
REF: share Index.difference (#38676)
1 parent 45bbe9a commit d8b5fac

File tree

6 files changed

+13
-47
lines changed

6 files changed

+13
-47
lines changed

pandas/core/indexes/base.py

+5
Original file line numberDiff line numberDiff line change
@@ -2906,8 +2906,13 @@ def difference(self, other, sort=None):
29062906
other, result_name = self._convert_can_do_setop(other)
29072907

29082908
if self.equals(other):
2909+
# Note: we do not (yet) sort even if sort=None GH#24959
29092910
return self[:0].rename(result_name)
29102911

2912+
if len(other) == 0:
2913+
# Note: we do not (yet) sort even if sort=None GH#24959
2914+
return self.rename(result_name)
2915+
29112916
result = self._difference(other, sort=sort)
29122917
return self._wrap_setop_result(other, result)
29132918

pandas/core/indexes/multi.py

+1-34
Original file line numberDiff line numberDiff line change
@@ -3676,42 +3676,9 @@ def _intersection(self, other, sort=False):
36763676
zip(*uniq_tuples), sortorder=0, names=result_names
36773677
)
36783678

3679-
def difference(self, other, sort=None):
3680-
"""
3681-
Compute set difference of two MultiIndex objects
3682-
3683-
Parameters
3684-
----------
3685-
other : MultiIndex
3686-
sort : False or None, default None
3687-
Sort the resulting MultiIndex if possible
3688-
3689-
.. versionadded:: 0.24.0
3690-
3691-
.. versionchanged:: 0.24.1
3692-
3693-
Changed the default value from ``True`` to ``None``
3694-
(without change in behaviour).
3695-
3696-
Returns
3697-
-------
3698-
diff : MultiIndex
3699-
"""
3700-
self._validate_sort_keyword(sort)
3701-
self._assert_can_do_setop(other)
3679+
def _difference(self, other, sort):
37023680
other, result_names = self._convert_can_do_setop(other)
37033681

3704-
if len(other) == 0:
3705-
return self.rename(result_names)
3706-
3707-
if self.equals(other):
3708-
return MultiIndex(
3709-
levels=self.levels,
3710-
codes=[[]] * self.nlevels,
3711-
names=result_names,
3712-
verify_integrity=False,
3713-
)
3714-
37153682
this = self._get_unique_index()
37163683

37173684
indexer = this.get_indexer(other)

pandas/core/indexes/period.py

-10
Original file line numberDiff line numberDiff line change
@@ -635,16 +635,6 @@ def _setop(self, other, sort, opname: str):
635635
def _intersection(self, other, sort=False):
636636
return self._setop(other, sort, opname="intersection")
637637

638-
def difference(self, other, sort=None):
639-
self._validate_sort_keyword(sort)
640-
self._assert_can_do_setop(other)
641-
other, result_name = self._convert_can_do_setop(other)
642-
643-
if self.equals(other):
644-
return self[:0].rename(result_name)
645-
646-
return self._difference(other, sort=sort)
647-
648638
def _difference(self, other, sort):
649639

650640
if is_object_dtype(other):

pandas/tests/indexes/datetimes/test_setops.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,8 @@ def test_difference(self, tz, sort):
326326
(rng3, other3, expected3),
327327
]:
328328
result_diff = rng.difference(other, sort)
329-
if sort is None:
329+
if sort is None and len(other):
330+
# We dont sort (yet?) when empty GH#24959
330331
expected = expected.sort_values()
331332
tm.assert_index_equal(result_diff, expected)
332333

pandas/tests/indexes/multi/test_setops.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,9 @@ def test_intersection(idx, sort):
294294
# assert result.equals(tuples)
295295

296296

297-
@pytest.mark.parametrize("method", ["intersection", "union"])
297+
@pytest.mark.parametrize(
298+
"method", ["intersection", "union", "difference", "symmetric_difference"]
299+
)
298300
def test_setop_with_categorical(idx, sort, method):
299301
other = idx.to_flat_index().astype("category")
300302
res_names = [None] * idx.nlevels

pandas/tests/indexes/period/test_setops.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,8 @@ def test_difference(self, sort):
318318
(rng7, other7, expected7),
319319
]:
320320
result_difference = rng.difference(other, sort=sort)
321-
if sort is None:
321+
if sort is None and len(other):
322+
# We dont sort (yet?) when empty GH#24959
322323
expected = expected.sort_values()
323324
tm.assert_index_equal(result_difference, expected)
324325

0 commit comments

Comments
 (0)