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_rightView on GitHub (pinned to 71959b8cb9)
Solutions
- Flatten the indexer: `ia[mask.ravel()]` after reshaping the underlying data to 1D.
- Operate per-column: loop or use `apply` over a 1D slice.
- 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
- Flatten 2D masks before indexing an IntervalArray.
- Operate per-column rather than with DataFrame-shaped masks on a single array.
- Use Series-of-intervals for 2D label-driven access.
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
- key must be an int or slice, got {type(key).__name__}
- name_or_index must be an int, str, bytes, pyarrow.compute.Ex
- Only integers, slices and integer or boolean arrays are vali
- only integers, slices (`:`), ellipsis (`...`), numpy.newaxis
- cannot do a non-empty take
AI-assisted analysis of pandas-dev/pandas@71959b8cb9 (2026-08-07).
Data as JSON: /api/errors/ae7e300df275526b.
Report an issue: GitHub.