Skip to content
14 changes: 11 additions & 3 deletions pandas/core/arrays/interval.py
Original file line number Diff line number Diff line change
Expand Up @@ -1992,9 +1992,17 @@ def _from_combined(self, combined: np.ndarray) -> IntervalArray:
def unique(self) -> IntervalArray:
# No overload variant of "__getitem__" of "ExtensionArray" matches argument
# type "Tuple[slice, int]"
nc = unique(
self._combined.view("complex128")[:, 0] # type: ignore[call-overload]
)
if needs_i8_conversion(self._left.dtype):
nc = unique(
self._combined.view("complex128")[:, 0] # type: ignore[call-overload]
)
else:
nc = unique(
# Using .view("complex128") with negatives causes issues.
# GH#61917
(np.array(self._combined[:, 0], dtype=complex))
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if this is More Correct, should we just patch inside _combined directly? The only other place it is used is isin; will there be an analaguos but there?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, agree we can add this logic directly in _combined.

+ (1j * np.array(self._combined[:, 1], dtype=complex))
)
nc = nc[:, None]
return self._from_combined(nc)

Expand Down
20 changes: 20 additions & 0 deletions pandas/tests/arrays/interval/test_interval.py
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,26 @@ def test_shift_datetime(self):
with pytest.raises(TypeError, match=msg):
a.shift(1, fill_value=np.timedelta64("NaT", "ns"))

def test_unique_with_negatives(self):
# GH#61917
idx_pos = IntervalIndex.from_tuples(
[(3, 4), (3, 4), (2, 3), (2, 3), (1, 2), (1, 2)]
)
result = idx_pos.unique()
assert result.shape == (3,), f"Expected shape (3,), got {result.shape}"

idx_neg = IntervalIndex.from_tuples(
[(-4, -3), (-4, -3), (-3, -2), (-3, -2), (-2, -1), (-2, -1)]
)
result = idx_neg.unique()
assert result.shape == (3,), f"Expected shape (3,), got {result.shape}"

idx_mix = IntervalIndex.from_tuples(
[(1, 2), (0, 1), (-1, 0), (-2, -1), (-3, -2), (-3, -2)]
)
result = idx_mix.unique()
assert result.shape == (5,), f"Expected shape (5,), got {result.shape}"


class TestSetitem:
def test_set_na(self, left_right_dtypes):
Expand Down
Loading