Skip to content

Commit fb228b6

Browse files
authored
Support stack (#192)
1 parent 24e5ead commit fb228b6

5 files changed

Lines changed: 30 additions & 1 deletion

File tree

cf_xarray/accessor.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,6 @@ def wrapper(obj: Union[DataArray, Dataset], key: str):
428428
"dim": (_get_dims,),
429429
"dims": (_get_dims,), # transpose
430430
"drop_dims": (_get_dims,), # drop_dims
431-
"dimensions": (_get_dims,), # stack
432431
"dims_dict": (_get_dims,), # swap_dims, rename_dims
433432
"shifts": (_get_dims,), # shift, roll
434433
"pad_width": (_get_dims,), # shift, roll
@@ -1435,6 +1434,23 @@ def drop(self, *args, **kwargs):
14351434
"Please use .cf.drop_vars or .cf.drop_sel as appropriate."
14361435
)
14371436

1437+
def stack(self, dimensions=None, **dimensions_kwargs):
1438+
# stack needs to rewrite the _values_ of a dict
1439+
# our other machinery rewrites the _keys_ of a dict
1440+
# This seems somewhat rare, so do it explicitly for now
1441+
1442+
if dimensions is None:
1443+
dimensions = dimensions_kwargs
1444+
for key, values in dimensions.items():
1445+
updates = [
1446+
apply_mapper(
1447+
(_single(_get_dims),), self._obj, v, error=True, default=[v]
1448+
)
1449+
for v in values
1450+
]
1451+
dimensions.update({key: tuple(itertools.chain(*updates))})
1452+
return self._obj.stack(dimensions)
1453+
14381454

14391455
@xr.register_dataset_accessor("cf")
14401456
class CFDatasetAccessor(CFAccessor):

cf_xarray/tests/test_accessor.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1041,3 +1041,13 @@ def test_groupby_special_ops():
10411041
expected = grouped - grouped.mean()
10421042
actual = grouped - cfgrouped.mean()
10431043
assert_identical(expected, actual)
1044+
1045+
1046+
@pytest.mark.parametrize("obj", objects)
1047+
def test_stack(obj):
1048+
expected = obj.stack(latlon=["lat", "lon"])
1049+
actual = obj.cf.stack(latlon=["latitude", "longitude"])
1050+
assert_identical(expected, actual)
1051+
1052+
actual = obj.cf.stack({"latlon": ["latitude", "longitude"]})
1053+
assert_identical(expected, actual)

ci/doc.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ dependencies:
66
- python=3.8
77
- matplotlib-base
88
- netcdf4
9+
- pooch
910
- xarray
1011
- sphinx
1112
- nbsphinx

ci/environment.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ dependencies:
99
- matplotlib-base
1010
- netcdf4
1111
- pandas
12+
- pooch
1213
- xarray

ci/upstream-dev-env.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ dependencies:
99
- matplotlib-base
1010
- netcdf4
1111
- pandas
12+
- pooch
1213
- pip:
1314
- git+https://github.com/pydata/xarray

0 commit comments

Comments
 (0)