pandas-dev/pandas · error · ValueError

multi-dimensional indexing not allowed

Error message

multi-dimensional indexing not allowed

What it means

Raised by `IntervalArray.__getitem__` when the indexer yields a 2-D result (e.g., a 2D boolean mask or nested list). IntervalArray is 1-dimensional and does not support multi-axis indexing (GH#30588). Fires at pandas/core/arrays/interval.py:684.

Source

Thrown at pandas/core/arrays/interval.py:684

    @overload
    def __getitem__(self, key: ScalarIndexer) -> IntervalOrNA: ...

    @overload
    def __getitem__(self, key: SequenceIndexer) -> Self: ...

    def __getitem__(self, key: PositionalIndexer) -> Self | IntervalOrNA:
        key = check_array_indexer(self, key)
        left = self._left[key]
        right = self._right[key]

        if not isinstance(left, (np.ndarray, ExtensionArray)):
            # scalar
            if is_scalar(left) and isna(left):
                return self._fill_value
            return Interval(left, right, self.closed)
        if np.ndim(left) > 1:
            # GH#30588 multi-dimensional indexer disallowed
            raise ValueError("multi-dimensional indexing not allowed")
        # Argument 2 to "_simple_new" of "IntervalArray" has incompatible type
        # "Union[Period, Timestamp, Timedelta, NaTType, DatetimeArray, TimedeltaArray,
        # ndarray[Any, Any]]"; expected "Union[Union[DatetimeArray, TimedeltaArray],
        # ndarray[Any, Any]]"
        result = self._simple_new(left, right, dtype=self.dtype)  # type: ignore[arg-type]
        if getitem_returns_view(self, key):
            result._readonly = self._readonly
        return result

    def __setitem__(self, key, value) -> None:
        if self._readonly:
            raise ValueError("Cannot modify read-only array")

        key = check_array_indexer(self, key)
        value_left, value_right = self._validate_setitem_value(value)

        self._left[key] = value_left
        self._right[key] = value_right

View on GitHub (pinned to 71959b8cb9)

Solutions

  1. Flatten the indexer: `ia[mask.ravel()]` after reshaping the underlying data to 1D.
  2. Operate per-column: loop or use `apply` over a 1D slice.
  3. Use a Series of intervals with `.loc` on a flattened index instead.

Example fix

// before
ia[df_bool_mask.values]  # 2D
// after
ia[df_bool_mask.values.ravel()]
Defensive patterns

Strategy: validation

Validate before calling

import numpy as np

def as_1d_indexer(idx):
    arr = np.asarray(idx)
    if arr.ndim > 1:
        arr = arr.ravel()
    return arr

Type guard

import numpy as np

def indexer_is_1d(idx) -> bool:
    return np.asarray(idx).ndim <= 1

Try / catch

try:
    sub = ia[key]
except ValueError as e:
    if "multi-dimensional indexing" in str(e):
        sub = ia[np.asarray(key).ravel()]
    else:
        raise

Prevention

When it happens

Trigger: `ia[np.array([[True, False], [False, True]])]`, `ia[[[0,1],[2,3]]]`, or fancy indexing that returns a 2D left/right slice.

Common situations: Applying a DataFrame-shaped mask to a column of intervals; reshape operations that produce 2D indexers.

Related errors


AI-assisted analysis of pandas-dev/pandas@71959b8cb9 (2026-08-07). Data as JSON: /api/errors/ae7e300df275526b. Report an issue: GitHub.