html_url,issue_url,id,node_id,user,created_at,updated_at,author_association,body,reactions,performed_via_github_app,issue
https://github.com/pydata/xarray/issues/7005#issuecomment-1240532341,https://api.github.com/repos/pydata/xarray/issues/7005,1240532341,IC_kwDOAMm_X85J8QV1,4160723,2022-09-08T10:32:31Z,2022-09-08T10:32:31Z,MEMBER,"Hi @jamesstidard,
> causes a ValueError I am struggling to interpret.
I agree that the error message is not very informative. This could be improved.
The problem in your example is located here:
```python
def map_coords(ds, *, name, mapping):
...
ds.coords[name] = xr.DataArray(new_values, coords=coord.coords)
...
```
Since v2022.6.0, multi-index level coordinates are real coordinates. What happens is that when you update ""x_one"" it invalidates the multi-index ""x"" - ""x_one"" - ""x_two"" in the DataArray:
```python
...
map_coords(mda, name=""z"", mapping={0: ""zero"", 1: ""one"", 2: ""two""}). # success
map_coords(mda, name=""x_one"", mapping={""a"": ""aa"", ""b"": ""bb"", ""c"": ""cc""}) # success
# the 'x', 'x_one' and 'x_two' indexes are all equal
mda.xindexes[""x_one""].equals(mda.xindexes[""x""]) and mda.xindexes[""x_one""].equals(mda.xindexes[""x_two""])
# True
# the 'x' and 'x_two' indexes are identical, but not the 'x_one' index!
mda.xindexes[""x""] is mda.xindexes[""x_two""]
# True
mda.xindexes[""x""] is mda.xindexes[""x_one""]
# False
```
Which explains the alignment error when you further try to update the DataArray.
I'm actually surprised that it doesn't raise any error at that point, like this:
```python
mda = xr.DataArray(np.random.rand(6, 6, 3), [(""x"", midx), (""y"", midy), (""z"", range(3))])
mda.coords[""x_two""] = (""x"", range(6))
# ValueError: cannot set or update variable(s) 'x_two', which would corrupt the following
# index built from coordinates 'x', 'x_one', 'x_two':
#
```
It seems like a bug.
Either way, you shouldn't try updating a single coordinate that is part of a multi-coordinate index, which is assumed immutable. Instead, you could use `reset_index`/`set_index` before/after updating the labels of one level coordinate. You could also replace the whole index and its coordinates at once (example below). I wouldn't rely too much on the latter option, though, as such special case for `pd.MultiIndex` might eventually be deprecated in Xarray.
```python
new_midx = midx.set_levels([""aa"", ""bb"", ""cc""], level=""x_one"")
mda.coords[""x""] = new_midx
```","{""total_count"": 0, ""+1"": 0, ""-1"": 0, ""laugh"": 0, ""hooray"": 0, ""confused"": 0, ""heart"": 0, ""rocket"": 0, ""eyes"": 0}",,1364911775