Skip to content

Commit da94b4f

Browse files
committed
reindex in .unstack for pandas consistency
1 parent 9364449 commit da94b4f

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

xray/core/dataset.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1386,14 +1386,17 @@ def unstack(self, dim):
13861386
raise ValueError('cannot unstack a dimension that does not have '
13871387
'a MultiIndex')
13881388

1389+
full_idx = pd.MultiIndex.from_product(index.levels, names=index.names)
1390+
obj = self.reindex(copy=False, **{dim: full_idx})
1391+
13891392
new_dim_names = index.names
13901393
if any(name is None for name in new_dim_names):
13911394
raise ValueError('cannot unstack dimension with unnamed levels')
13921395

13931396
new_dim_sizes = [lev.size for lev in index.levels]
13941397

13951398
variables = OrderedDict()
1396-
for name, var in self.variables.items():
1399+
for name, var in obj.variables.items():
13971400
if name != dim:
13981401
if dim in var.dims:
13991402
new_dims = OrderedDict(zip(new_dim_names, new_dim_sizes))

xray/test/test_dataarray.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,15 @@ def test_stack_unstack(self):
868868
actual = orig.stack(z=['x', 'y']).unstack('z')
869869
self.assertDataArrayIdentical(orig, actual)
870870

871+
def test_unstack_pandas_consistency(self):
872+
df = pd.DataFrame({'foo': range(3),
873+
'x': ['a', 'b', 'b'],
874+
'y': [0, 0, 1]})
875+
s = df.set_index(['x', 'y'])['foo']
876+
expected = DataArray(s.unstack(), name='foo')
877+
actual = DataArray(s, dims='z').unstack('z')
878+
self.assertDataArrayIdentical(expected, actual)
879+
871880
def test_transpose(self):
872881
self.assertVariableEqual(self.dv.variable.transpose(),
873882
self.dv.transpose())

0 commit comments

Comments
 (0)