Skip to content

Commit e4189e2

Browse files
authored
CLN: setops (#42228)
1 parent 568b56b commit e4189e2

File tree

2 files changed

+23
-22
lines changed

2 files changed

+23
-22
lines changed

pandas/core/indexes/base.py

+18-3
Original file line numberDiff line numberDiff line change
@@ -3089,8 +3089,6 @@ def _intersection(self, other: Index, sort=False):
30893089
"""
30903090
intersection specialized to the case with matching dtypes.
30913091
"""
3092-
# TODO(EA): setops-refactor, clean all this up
3093-
30943092
if self.is_monotonic and other.is_monotonic:
30953093
try:
30963094
result = self._inner_indexer(other)[0]
@@ -3109,6 +3107,7 @@ def _wrap_intersection_result(self, other, result):
31093107
# We will override for MultiIndex to handle empty results
31103108
return self._wrap_setop_result(other, result)
31113109

3110+
@final
31123111
def _intersection_via_get_indexer(self, other: Index, sort) -> ArrayLike:
31133112
"""
31143113
Find the intersection of two Indexes using get_indexer.
@@ -3184,9 +3183,10 @@ def difference(self, other, sort=None):
31843183
return self.rename(result_name)
31853184

31863185
result = self._difference(other, sort=sort)
3187-
return self._wrap_setop_result(other, result)
3186+
return self._wrap_difference_result(other, result)
31883187

31893188
def _difference(self, other, sort):
3189+
# overridden by RangeIndex
31903190

31913191
this = self.unique()
31923192

@@ -3199,6 +3199,11 @@ def _difference(self, other, sort):
31993199

32003200
return the_diff
32013201

3202+
def _wrap_difference_result(self, other, result):
3203+
# We will override for MultiIndex to handle empty results
3204+
return self._wrap_setop_result(other, result)
3205+
3206+
@final
32023207
def symmetric_difference(self, other, result_name=None, sort=None):
32033208
"""
32043209
Compute the symmetric difference of two Index objects.
@@ -3246,6 +3251,16 @@ def symmetric_difference(self, other, result_name=None, sort=None):
32463251

32473252
if result_name is not None:
32483253
result = result.rename(result_name)
3254+
3255+
if self._is_multi and len(result) == 0:
3256+
# On equal symmetric_difference MultiIndexes the difference is empty.
3257+
# Therefore, an empty MultiIndex is returned GH#13490
3258+
return type(self)(
3259+
levels=[[] for _ in range(self.nlevels)],
3260+
codes=[[] for _ in range(self.nlevels)],
3261+
names=result.names,
3262+
)
3263+
32493264
return result
32503265

32513266
@final

pandas/core/indexes/multi.py

+5-19
Original file line numberDiff line numberDiff line change
@@ -3552,7 +3552,7 @@ def _maybe_match_names(self, other):
35523552
return names
35533553

35543554
def _wrap_intersection_result(self, other, result):
3555-
other, result_names = self._convert_can_do_setop(other)
3555+
_, result_names = self._convert_can_do_setop(other)
35563556

35573557
if len(result) == 0:
35583558
return MultiIndex(
@@ -3564,20 +3564,18 @@ def _wrap_intersection_result(self, other, result):
35643564
else:
35653565
return MultiIndex.from_arrays(zip(*result), sortorder=0, names=result_names)
35663566

3567-
def _difference(self, other, sort) -> MultiIndex:
3568-
other, result_names = self._convert_can_do_setop(other)
3569-
3570-
difference = super()._difference(other, sort)
3567+
def _wrap_difference_result(self, other, result):
3568+
_, result_names = self._convert_can_do_setop(other)
35713569

3572-
if len(difference) == 0:
3570+
if len(result) == 0:
35733571
return MultiIndex(
35743572
levels=[[]] * self.nlevels,
35753573
codes=[[]] * self.nlevels,
35763574
names=result_names,
35773575
verify_integrity=False,
35783576
)
35793577
else:
3580-
return MultiIndex.from_tuples(difference, sortorder=0, names=result_names)
3578+
return MultiIndex.from_tuples(result, sortorder=0, names=result_names)
35813579

35823580
def _convert_can_do_setop(self, other):
35833581
result_names = self.names
@@ -3599,18 +3597,6 @@ def _convert_can_do_setop(self, other):
35993597

36003598
return other, result_names
36013599

3602-
def symmetric_difference(self, other, result_name=None, sort=None):
3603-
# On equal symmetric_difference MultiIndexes the difference is empty.
3604-
# Therefore, an empty MultiIndex is returned GH13490
3605-
tups = Index.symmetric_difference(self, other, result_name, sort)
3606-
if len(tups) == 0:
3607-
return type(self)(
3608-
levels=[[] for _ in range(self.nlevels)],
3609-
codes=[[] for _ in range(self.nlevels)],
3610-
names=tups.names,
3611-
)
3612-
return tups
3613-
36143600
# --------------------------------------------------------------------
36153601

36163602
@doc(Index.astype)

0 commit comments

Comments
 (0)