Skip to content

Commit db36c5c

Browse files
hazbottlesfujiisoup
authored andcommitted
add multiindex level name checking to .rename() (#3658)
* add multiindex level name checking to .rename() * update whats-new.rst
1 parent b3d3b44 commit db36c5c

File tree

3 files changed

+18
-1
lines changed

3 files changed

+18
-1
lines changed

doc/whats-new.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ Bug fixes
6262
By `Tom Augspurger <https://github.com/TomAugspurger>`_.
6363
- Ensure :py:meth:`Dataset.quantile`, :py:meth:`DataArray.quantile` issue the correct error
6464
when ``q`` is out of bounds (:issue:`3634`) by `Mathias Hauser <https://github.com/mathause>`_.
65+
- :py:meth:`Dataset.rename`, :py:meth:`DataArray.rename` now check for conflicts with
66+
MultiIndex level names.
6567

6668
Documentation
6769
~~~~~~~~~~~~~

xarray/core/dataset.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,13 @@
8989
is_scalar,
9090
maybe_wrap_array,
9191
)
92-
from .variable import IndexVariable, Variable, as_variable, broadcast_variables
92+
from .variable import (
93+
IndexVariable,
94+
Variable,
95+
as_variable,
96+
broadcast_variables,
97+
assert_unique_multiindex_level_names,
98+
)
9399

94100
if TYPE_CHECKING:
95101
from ..backends import AbstractDataStore, ZarrStore
@@ -2780,6 +2786,7 @@ def rename(
27802786
variables, coord_names, dims, indexes = self._rename_all(
27812787
name_dict=name_dict, dims_dict=name_dict
27822788
)
2789+
assert_unique_multiindex_level_names(variables)
27832790
return self._replace(variables, coord_names, dims=dims, indexes=indexes)
27842791

27852792
def rename_dims(

xarray/tests/test_dataset.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2461,6 +2461,14 @@ def test_rename_vars(self):
24612461
with pytest.raises(ValueError):
24622462
original.rename_vars(names_dict_bad)
24632463

2464+
def test_rename_multiindex(self):
2465+
mindex = pd.MultiIndex.from_tuples(
2466+
[([1, 2]), ([3, 4])], names=["level0", "level1"]
2467+
)
2468+
data = Dataset({}, {"x": mindex})
2469+
with raises_regex(ValueError, "conflicting MultiIndex"):
2470+
data.rename({"x": "level0"})
2471+
24642472
@requires_cftime
24652473
def test_rename_does_not_change_CFTimeIndex_type(self):
24662474
# make sure CFTimeIndex is not converted to DatetimeIndex #3522

0 commit comments

Comments
 (0)