Skip to content

Commit 2908dd4

Browse files
authored
raise error on slice-based selection of multi-index levels (#11168)
previously, calling .sel(level=slice(...)) on a multi-index level would silently produce wrong results by passing the slice directly to pandas get_loc_level, which interprets it as a range query on that level alone. now raises a ValueError with a clear message instead. closes #10534
1 parent 1f2472f commit 2908dd4

2 files changed

Lines changed: 16 additions & 0 deletions

File tree

xarray/core/indexes.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,16 @@ def sel(self, labels, method=None, tolerance=None) -> IndexSelResult:
13081308

13091309
has_slice = any(isinstance(v, slice) for v in label_values.values())
13101310

1311+
if has_slice:
1312+
slice_levels = [
1313+
k for k, v in label_values.items() if isinstance(v, slice)
1314+
]
1315+
raise ValueError(
1316+
f"slice-based selection on multi-index level(s) {slice_levels} "
1317+
f"is not supported. Use scalar values for multi-index level "
1318+
f"selection instead, e.g., ``.sel({slice_levels[0]}=value)``."
1319+
)
1320+
13111321
if len(label_values) == self.index.nlevels and not has_slice:
13121322
indexer = self.index.get_loc(
13131323
tuple(label_values[k] for k in self.index.names)

xarray/tests/test_dataset.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2246,6 +2246,12 @@ def test_sel(
22462246

22472247
assert_identical(mdata.sel(x={"one": "a", "two": 1}), mdata.sel(one="a", two=1))
22482248

2249+
# GH10534: slicing on multi-index levels should raise
2250+
with pytest.raises(ValueError, match="slice-based selection on multi-index"):
2251+
mdata.sel(one=slice("a", "b"))
2252+
with pytest.raises(ValueError, match="slice-based selection on multi-index"):
2253+
mdata.sel(two=slice(1, 2))
2254+
22492255
def test_broadcast_like(self) -> None:
22502256
original1 = DataArray(
22512257
np.random.randn(5), [("x", range(5))], name="a"

0 commit comments

Comments
 (0)