Skip to content
This repository was archived by the owner on Jul 10, 2024. It is now read-only.

Commit 6c1c732

Browse files
BUG: Fix joining overlapping IntervalIndex objects (pandas-devGH-45661)
Replacing calls to `get_indexer()` with `get_indexer_for()` as `IntervalIndex`es can be unique and overlapping. Similar to pandas-dev#44588
1 parent 20d0964 commit 6c1c732

File tree

3 files changed

+47
-2
lines changed

3 files changed

+47
-2
lines changed

doc/source/whatsnew/v1.4.1.rst

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Fixed regressions
1616
~~~~~~~~~~~~~~~~~
1717
- Regression in :meth:`Series.mask` with ``inplace=True`` and ``PeriodDtype`` and an incompatible ``other`` coercing to a common dtype instead of raising (:issue:`45546`)
1818
- Regression in :meth:`DataFrame.loc.__setitem__` losing :class:`Index` name if :class:`DataFrame` was empty before (:issue:`45621`)
19+
- Fixed failing join operations with overlapping ``IntervalIndex`` (:issue:`45661`)
1920
-
2021

2122
.. ---------------------------------------------------------------------------

pandas/core/indexes/base.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -4580,11 +4580,11 @@ def _join_via_get_indexer(
45804580
if join_index is self:
45814581
lindexer = None
45824582
else:
4583-
lindexer = self.get_indexer(join_index)
4583+
lindexer = self.get_indexer_for(join_index)
45844584
if join_index is other:
45854585
rindexer = None
45864586
else:
4587-
rindexer = other.get_indexer(join_index)
4587+
rindexer = other.get_indexer_for(join_index)
45884588
return join_index, lindexer, rindexer
45894589

45904590
@final
+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import pytest
2+
3+
from pandas import (
4+
IntervalIndex,
5+
MultiIndex,
6+
RangeIndex,
7+
)
8+
import pandas._testing as tm
9+
10+
11+
@pytest.fixture
12+
def range_index():
13+
return RangeIndex(3, name="range_index")
14+
15+
16+
@pytest.fixture
17+
def interval_index():
18+
return IntervalIndex.from_tuples(
19+
[(0.0, 1.0), (1.0, 2.0), (1.5, 2.5)], name="interval_index"
20+
)
21+
22+
23+
def test_join_overlapping_in_mi_to_same_intervalindex(range_index, interval_index):
24+
# GH-45661
25+
multi_index = MultiIndex.from_product([interval_index, range_index])
26+
result = multi_index.join(interval_index)
27+
28+
tm.assert_index_equal(result, multi_index)
29+
30+
31+
def test_join_overlapping_to_multiindex_with_same_interval(range_index, interval_index):
32+
# GH-45661
33+
multi_index = MultiIndex.from_product([interval_index, range_index])
34+
result = interval_index.join(multi_index)
35+
36+
tm.assert_index_equal(result, multi_index)
37+
38+
39+
def test_join_overlapping_interval_to_another_intervalindex(interval_index):
40+
# GH-45661
41+
flipped_interval_index = interval_index[::-1]
42+
result = interval_index.join(flipped_interval_index)
43+
44+
tm.assert_index_equal(result, interval_index)

0 commit comments

Comments
 (0)