Skip to content

Commit b23bba9

Browse files
authored
BUG: Clean intersection and fix resulting names when MultiIndex are equal (#38302)
1 parent 9310cb7 commit b23bba9

File tree

6 files changed

+26
-3
lines changed

6 files changed

+26
-3
lines changed

pandas/core/indexes/base.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -2826,7 +2826,9 @@ def intersection(self, other, sort=False):
28262826
self._assert_can_do_setop(other)
28272827
other, _ = self._convert_can_do_setop(other)
28282828

2829-
if self.equals(other) and not self.has_duplicates:
2829+
if self.equals(other):
2830+
if self.has_duplicates:
2831+
return self.unique()._get_reconciled_name_object(other)
28302832
return self._get_reconciled_name_object(other)
28312833

28322834
if not is_dtype_equal(self.dtype, other.dtype):

pandas/core/indexes/interval.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,9 @@ def intersection(self, other, sort=False) -> Index:
980980
self._assert_can_do_setop(other)
981981
other, _ = self._convert_can_do_setop(other)
982982

983-
if self.equals(other) and not self.has_duplicates:
983+
if self.equals(other):
984+
if self.has_duplicates:
985+
return self.unique()._get_reconciled_name_object(other)
984986
return self._get_reconciled_name_object(other)
985987

986988
if not isinstance(other, IntervalIndex):

pandas/core/indexes/multi.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -3619,7 +3619,7 @@ def intersection(self, other, sort=False):
36193619
if self.equals(other):
36203620
if self.has_duplicates:
36213621
return self.unique().rename(result_names)
3622-
return self._get_reconciled_name_object(other)
3622+
return self.rename(result_names)
36233623

36243624
return self._intersection(other, sort=sort)
36253625

pandas/core/indexes/period.py

+2
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,8 @@ def intersection(self, other, sort=False):
639639
other, _ = self._convert_can_do_setop(other)
640640

641641
if self.equals(other):
642+
if self.has_duplicates:
643+
return self.unique()._get_reconciled_name_object(other)
642644
return self._get_reconciled_name_object(other)
643645

644646
return self._intersection(other, sort=sort)

pandas/tests/indexes/multi/test_setops.py

+10
Original file line numberDiff line numberDiff line change
@@ -419,3 +419,13 @@ def test_intersect_with_duplicates(tuples, exp_tuples):
419419
result = left.intersection(right)
420420
expected = MultiIndex.from_tuples(exp_tuples, names=["first", "second"])
421421
tm.assert_index_equal(result, expected)
422+
423+
424+
def test_intersection_equal_different_names():
425+
# GH#30302
426+
mi1 = MultiIndex.from_arrays([[1, 2], [3, 4]], names=["c", "b"])
427+
mi2 = MultiIndex.from_arrays([[1, 2], [3, 4]], names=["a", "b"])
428+
429+
result = mi1.intersection(mi2)
430+
expected = MultiIndex.from_arrays([[1, 2], [3, 4]], names=[None, "b"])
431+
tm.assert_index_equal(result, expected)

pandas/tests/indexes/period/test_setops.py

+7
Original file line numberDiff line numberDiff line change
@@ -339,3 +339,10 @@ def test_difference_freq(self, sort):
339339
expected = PeriodIndex(["20160920", "20160921"], freq="D")
340340
tm.assert_index_equal(idx_diff, expected)
341341
tm.assert_attr_equal("freq", idx_diff, expected)
342+
343+
def test_intersection_equal_duplicates(self):
344+
# GH#38302
345+
idx = pd.period_range("2011-01-01", periods=2)
346+
idx_dup = idx.append(idx)
347+
result = idx_dup.intersection(idx_dup)
348+
tm.assert_index_equal(result, idx)

0 commit comments

Comments
 (0)