@@ -299,7 +299,7 @@ class ResolvedGrouper(Generic[T_DataWithCoords]):
299299 codes : DataArray = field (init = False )
300300 full_index : pd .Index = field (init = False )
301301 group_indices : T_GroupIndices = field (init = False )
302- unique_coord : IndexVariable | _DummyGroup = field (init = False )
302+ unique_coord : Variable | _DummyGroup = field (init = False )
303303
304304 # _ensure_1d:
305305 group1d : T_Group = field (init = False )
@@ -328,14 +328,18 @@ def __post_init__(self) -> None:
328328
329329 @property
330330 def name (self ) -> Hashable :
331+ """Name for the grouped coordinate after reduction."""
331332 # the name has to come from unique_coord because we need `_bins` suffix for BinGrouper
332- return self .unique_coord .name
333+ (name ,) = self .unique_coord .dims
334+ return name
333335
334336 @property
335337 def size (self ) -> int :
338+ """Number of groups."""
336339 return len (self )
337340
338341 def __len__ (self ) -> int :
342+ """Number of groups."""
339343 return len (self .full_index )
340344
341345 @property
@@ -358,8 +362,8 @@ def factorize(self) -> None:
358362 ]
359363 if encoded .unique_coord is None :
360364 unique_values = self .full_index [np .unique (encoded .codes )]
361- self .unique_coord = IndexVariable (
362- self .codes .name , unique_values , attrs = self .group .attrs
365+ self .unique_coord = Variable (
366+ dims = self .codes .name , data = unique_values , attrs = self .group .attrs
363367 )
364368 else :
365369 self .unique_coord = encoded .unique_coord
@@ -620,6 +624,8 @@ def _iter_grouped(self, warn_squeeze=True) -> Iterator[T_Xarray]:
620624 yield self ._obj .isel ({self ._group_dim : indices })
621625
622626 def _infer_concat_args (self , applied_example ):
627+ from xarray .core .groupers import BinGrouper
628+
623629 (grouper ,) = self .groupers
624630 if self ._group_dim in applied_example .dims :
625631 coord = grouper .group1d
@@ -628,7 +634,10 @@ def _infer_concat_args(self, applied_example):
628634 coord = grouper .unique_coord
629635 positions = None
630636 (dim ,) = coord .dims
631- if isinstance (coord , _DummyGroup ):
637+ if isinstance (grouper .group , _DummyGroup ) and not isinstance (
638+ grouper .grouper , BinGrouper
639+ ):
640+ # When binning we actually do set the index
632641 coord = None
633642 coord = getattr (coord , "variable" , coord )
634643 return coord , dim , positions
@@ -645,12 +654,20 @@ def _binary_op(self, other, f, reflexive=False):
645654 codes = self ._codes
646655 dims = group .dims
647656
648- if isinstance (group , _DummyGroup ):
657+ if isinstance (grouper . group , _DummyGroup ):
649658 group = coord = group .to_dataarray ()
650659 else :
651660 coord = grouper .unique_coord
652- if not isinstance (coord , DataArray ):
653- coord = DataArray (grouper .unique_coord )
661+ if isinstance (coord , Variable ):
662+ assert coord .ndim == 1
663+ (coord_dim ,) = coord .dims
664+ # TODO: explicitly create Index here
665+ coord = DataArray (
666+ dims = coord_dim ,
667+ data = coord .data ,
668+ attrs = coord .attrs ,
669+ coords = {coord_dim : coord .data },
670+ )
654671 name = grouper .name
655672
656673 if not isinstance (other , (Dataset , DataArray )):
@@ -848,7 +865,10 @@ def _flox_reduce(
848865 # in the grouped variable
849866 group_dims = grouper .group .dims
850867 if set (group_dims ).issubset (set (parsed_dim )):
851- result [grouper .name ] = output_index
868+ new_coord = Variable (
869+ dims = grouper .name , data = np .array (output_index ), attrs = self ._codes .attrs
870+ )
871+ result = result .assign_coords ({grouper .name : new_coord })
852872 result = result .drop_vars (unindexed_dims )
853873
854874 # broadcast and restore non-numeric data variables (backcompat)
0 commit comments