Skip to content

Commit 618bf88

Browse files
authored
BUG: MultiIndex.get_indexer with method not raising for non-monotonic (#55352)
raise ValueError for get_indexer with method and non-monotonic
1 parent cd8516a commit 618bf88

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

doc/source/whatsnew/v2.2.0.rst

+1-1
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,7 @@ Missing
310310

311311
MultiIndex
312312
^^^^^^^^^^
313-
-
313+
- Bug in :meth:`MultiIndex.get_indexer` not raising ``ValueError`` when ``method`` provided and index is non-monotonic (:issue:`53452`)
314314
-
315315

316316
I/O

pandas/core/indexes/base.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -4011,8 +4011,8 @@ def _get_fill_indexer(
40114011
self, target: Index, method: str_t, limit: int | None = None, tolerance=None
40124012
) -> npt.NDArray[np.intp]:
40134013
if self._is_multi:
4014-
# TODO: get_indexer_with_fill docstring says values must be _sorted_
4015-
# but that doesn't appear to be enforced
4014+
if not (self.is_monotonic_increasing or self.is_monotonic_decreasing):
4015+
raise ValueError("index must be monotonic increasing or decreasing")
40164016
# error: "IndexEngine" has no attribute "get_indexer_with_fill"
40174017
engine = self._engine
40184018
with warnings.catch_warnings():

pandas/tests/indexes/multi/test_indexing.py

+13
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,19 @@ def test_get_indexer_methods(self):
342342
expected = np.array([4, 6, 7], dtype=pad_indexer.dtype)
343343
tm.assert_almost_equal(expected, pad_indexer)
344344

345+
@pytest.mark.parametrize("method", ["pad", "ffill", "backfill", "bfill", "nearest"])
346+
def test_get_indexer_methods_raise_for_non_monotonic(self, method):
347+
# 53452
348+
mi = MultiIndex.from_arrays([[0, 4, 2], [0, 4, 2]])
349+
if method == "nearest":
350+
err = NotImplementedError
351+
msg = "not implemented yet for MultiIndex"
352+
else:
353+
err = ValueError
354+
msg = "index must be monotonic increasing or decreasing"
355+
with pytest.raises(err, match=msg):
356+
mi.get_indexer([(1, 1)], method=method)
357+
345358
def test_get_indexer_three_or_more_levels(self):
346359
# https://github.com/pandas-dev/pandas/issues/29896
347360
# tests get_indexer() on MultiIndexes with 3+ levels

0 commit comments

Comments
 (0)