diff --git a/xarray/core/dataset.py b/xarray/core/dataset.py index a5a958ddcbe..e02e82404b6 100644 --- a/xarray/core/dataset.py +++ b/xarray/core/dataset.py @@ -6065,6 +6065,8 @@ def drop_sel( Data variables: A (x, y) int64 32B 0 2 3 5 """ + from xarray.core.dataarray import DataArray + if errors not in ["raise", "ignore"]: raise ValueError('errors must be either "raise" or "ignore"') @@ -6076,7 +6078,11 @@ def drop_sel( # is a large numpy array if utils.is_scalar(labels_for_dim): labels_for_dim = [labels_for_dim] - labels_for_dim = np.asarray(labels_for_dim) + # Most conversion to arrays is better handled in the indexer, however + # DataArrays are a special case where the underlying libraries don't provide + # a good conversition. + if isinstance(labels_for_dim, DataArray): + labels_for_dim = np.asarray(labels_for_dim) try: index = self.get_index(dim) except KeyError as err: diff --git a/xarray/tests/test_dataset.py b/xarray/tests/test_dataset.py index cee8f2c82f2..630bfea46c5 100644 --- a/xarray/tests/test_dataset.py +++ b/xarray/tests/test_dataset.py @@ -2980,6 +2980,21 @@ def test_drop_multiindex_level(self) -> None: actual = data.drop_vars("level_1") assert_identical(expected, actual) + def test_drop_multiindex_labels(self) -> None: + data = create_test_multiindex() + mindex = pd.MultiIndex.from_tuples( + [ + ("a", 2), + ("b", 1), + ("b", 2), + ], + names=("level_1", "level_2"), + ) + expected = Dataset({}, Coordinates.from_pandas_multiindex(mindex, "x")) + + actual = data.drop_sel(x=("a", 1)) + assert_identical(expected, actual) + def test_drop_index_labels(self) -> None: data = Dataset({"A": (["x", "y"], np.random.randn(2, 3)), "x": ["a", "b"]})