Skip to content

Commit 89dddc1

Browse files
authored
Fix indexes created by Dataset.swap_dims (#2845)
Fixes GH2842
1 parent 72e6208 commit 89dddc1

File tree

3 files changed

+9
-13
lines changed

3 files changed

+9
-13
lines changed

doc/whats-new.rst

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ Enhancements
2525
Bug fixes
2626
~~~~~~~~~
2727

28+
- ``swap_dims`` would create incorrect ``indexes`` (:issue:`2842`).
29+
By `Stephan Hoyer <https://github.com/shoyer>`_.
30+
2831

2932
.. _whats-new.0.12.0:
3033

xarray/core/dataset.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2307,24 +2307,20 @@ def swap_dims(self, dims_dict, inplace=None):
23072307
coord_names.update(dims_dict.values())
23082308

23092309
variables = OrderedDict()
2310+
indexes = OrderedDict()
23102311
for k, v in self.variables.items():
23112312
dims = tuple(dims_dict.get(dim, dim) for dim in v.dims)
23122313
if k in result_dims:
23132314
var = v.to_index_variable()
2315+
if k in self.indexes:
2316+
indexes[k] = self.indexes[k]
2317+
else:
2318+
indexes[k] = var.to_index()
23142319
else:
23152320
var = v.to_base_variable()
23162321
var.dims = dims
23172322
variables[k] = var
23182323

2319-
indexes = OrderedDict()
2320-
for k, v in self.indexes.items():
2321-
if k in dims_dict:
2322-
new_name = dims_dict[k]
2323-
new_index = variables[k].to_index()
2324-
indexes[new_name] = new_index
2325-
else:
2326-
indexes[k] = v
2327-
23282324
return self._replace_with_new_dims(variables, coord_names,
23292325
indexes=indexes, inplace=inplace)
23302326

xarray/tests/test_dataset.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2002,14 +2002,11 @@ def test_swap_dims(self):
20022002
assert_identical(expected, actual)
20032003
assert isinstance(actual.variables['y'], IndexVariable)
20042004
assert isinstance(actual.variables['x'], Variable)
2005+
assert actual.indexes['y'].equals(pd.Index(list('abc')))
20052006

20062007
roundtripped = actual.swap_dims({'y': 'x'})
20072008
assert_identical(original.set_coords('y'), roundtripped)
20082009

2009-
actual = original.copy()
2010-
actual = actual.swap_dims({'x': 'y'})
2011-
assert_identical(expected, actual)
2012-
20132010
with raises_regex(ValueError, 'cannot swap'):
20142011
original.swap_dims({'y': 'x'})
20152012
with raises_regex(ValueError, 'replacement dimension'):

0 commit comments

Comments
 (0)