From b0022cb93b40802464fb37e4e084dd30f85fd00f Mon Sep 17 00:00:00 2001 From: dcherian Date: Wed, 11 May 2022 09:25:34 -0600 Subject: [PATCH 1/5] Restore old MultiIndex dropping behaviour Closes #6505 --- xarray/core/dataset.py | 16 ++++++++++++++++ xarray/tests/test_dataarray.py | 9 +++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/xarray/core/dataset.py b/xarray/core/dataset.py index f8c2223157e..76a847a14cc 100644 --- a/xarray/core/dataset.py +++ b/xarray/core/dataset.py @@ -4551,6 +4551,22 @@ def drop_vars( if errors == "raise": self._assert_all_in_dataset(names) + # GH6505 + other_names = [] + for var in names: + maybe_midx = self._indexes.get(var, None) + if isinstance(maybe_midx, PandasMultiIndex): + for other in set(self._indexes) - set(names): + if self._indexes[other].equals(maybe_midx): + other_names.append(other) + if other_names: + names |= set(other_names) + warnings.warn( + f"Deleting a single level of a MultiIndex is deprecated. Previously, this deleted all levels of a MultiIndex. " + f"Please also drop the following variables: {other_names!r} to avoid an error in the future.", + DeprecationWarning, + ) + assert_no_index_corrupted(self.xindexes, names) variables = {k: v for k, v in self._variables.items() if k not in names} diff --git a/xarray/tests/test_dataarray.py b/xarray/tests/test_dataarray.py index b8c9edd7258..8e1099b7e33 100644 --- a/xarray/tests/test_dataarray.py +++ b/xarray/tests/test_dataarray.py @@ -2360,10 +2360,11 @@ def test_drop_coordinates(self): assert_identical(actual, renamed) def test_drop_multiindex_level(self): - with pytest.raises( - ValueError, match=r"cannot remove coordinate.*corrupt.*index " - ): - self.mda.drop_vars("level_1") + # GH6505 + expected = self.mda.drop_vars(["x", "level_1", "level_2"]) + with pytest.warns(DeprecationWarning): + actual = self.mda.drop_vars("level_1") + assert_identical(expected, actual) def test_drop_all_multiindex_levels(self): dim_levels = ["x", "level_1", "level_2"] From ea517439acc84402bc9e8e2654884cad552fceb9 Mon Sep 17 00:00:00 2001 From: dcherian Date: Wed, 11 May 2022 09:36:27 -0600 Subject: [PATCH 2/5] Fix dataset test --- xarray/tests/test_dataset.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/xarray/tests/test_dataset.py b/xarray/tests/test_dataset.py index c1fb161fb6a..a869fe759b1 100644 --- a/xarray/tests/test_dataset.py +++ b/xarray/tests/test_dataset.py @@ -2418,11 +2418,9 @@ def test_drop_variables(self): def test_drop_multiindex_level(self): data = create_test_multiindex() - - with pytest.raises( - ValueError, match=r"cannot remove coordinate.*corrupt.*index " - ): - data.drop_vars("level_1") + expected = data.drop_vars(["x", "level_1", "level_2"]) + actual = data.drop_vars("level_1") + assert_identical(expected, actual) def test_drop_index_labels(self): data = Dataset({"A": (["x", "y"], np.random.randn(2, 3)), "x": ["a", "b"]}) From f35466ddc78b2cd8410afbd86ef46c7eab2f5caa Mon Sep 17 00:00:00 2001 From: Deepak Cherian Date: Wed, 11 May 2022 11:21:52 -0600 Subject: [PATCH 3/5] Update xarray/core/dataset.py Co-authored-by: Benoit Bovy --- xarray/core/dataset.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xarray/core/dataset.py b/xarray/core/dataset.py index 76a847a14cc..73791a7cffc 100644 --- a/xarray/core/dataset.py +++ b/xarray/core/dataset.py @@ -4552,13 +4552,13 @@ def drop_vars( self._assert_all_in_dataset(names) # GH6505 - other_names = [] + other_names = set() for var in names: maybe_midx = self._indexes.get(var, None) if isinstance(maybe_midx, PandasMultiIndex): - for other in set(self._indexes) - set(names): - if self._indexes[other].equals(maybe_midx): - other_names.append(other) + idx_coord_names = set(maybe_idx.index.names + [maybe_idx.dim]) + idx_other_names = idx_coord_names - set(names) + other_names.update(idx_other_names) if other_names: names |= set(other_names) warnings.warn( From ea5429a9179e25530f49b91fe118d97f329fb2ec Mon Sep 17 00:00:00 2001 From: dcherian Date: Wed, 11 May 2022 11:23:04 -0600 Subject: [PATCH 4/5] review comments. --- xarray/core/dataset.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/xarray/core/dataset.py b/xarray/core/dataset.py index 73791a7cffc..8b2f4783e34 100644 --- a/xarray/core/dataset.py +++ b/xarray/core/dataset.py @@ -4556,15 +4556,16 @@ def drop_vars( for var in names: maybe_midx = self._indexes.get(var, None) if isinstance(maybe_midx, PandasMultiIndex): - idx_coord_names = set(maybe_idx.index.names + [maybe_idx.dim]) + idx_coord_names = set(maybe_midx.index.names + [maybe_midx.dim]) idx_other_names = idx_coord_names - set(names) - other_names.update(idx_other_names) + other_names.update(idx_other_names) if other_names: names |= set(other_names) warnings.warn( f"Deleting a single level of a MultiIndex is deprecated. Previously, this deleted all levels of a MultiIndex. " f"Please also drop the following variables: {other_names!r} to avoid an error in the future.", DeprecationWarning, + stacklevel=2, ) assert_no_index_corrupted(self.xindexes, names) From 752a43242bd2bac92bd403666bb8a10430334232 Mon Sep 17 00:00:00 2001 From: dcherian Date: Wed, 11 May 2022 11:24:34 -0600 Subject: [PATCH 5/5] Catch warning in dataset test. --- xarray/tests/test_dataset.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/xarray/tests/test_dataset.py b/xarray/tests/test_dataset.py index a869fe759b1..8c23205eb2d 100644 --- a/xarray/tests/test_dataset.py +++ b/xarray/tests/test_dataset.py @@ -2419,7 +2419,8 @@ def test_drop_variables(self): def test_drop_multiindex_level(self): data = create_test_multiindex() expected = data.drop_vars(["x", "level_1", "level_2"]) - actual = data.drop_vars("level_1") + with pytest.warns(DeprecationWarning): + actual = data.drop_vars("level_1") assert_identical(expected, actual) def test_drop_index_labels(self):