Create a GroupBy object Parameters ---------- obj : Dataset or DataArray Object to group. grouper : Grouper Grouper object restore_coord_dims : bool, default: True If True, also restore the dimension order of multi-dimensio
(
self,
obj: T_Xarray,
groupers: tuple[ResolvedGrouper, ...],
restore_coord_dims: bool = True,
)
| 637 | encoded: EncodedGroups |
| 638 | |
| 639 | def __init__( |
| 640 | self, |
| 641 | obj: T_Xarray, |
| 642 | groupers: tuple[ResolvedGrouper, ...], |
| 643 | restore_coord_dims: bool = True, |
| 644 | ) -> None: |
| 645 | """Create a GroupBy object |
| 646 | |
| 647 | Parameters |
| 648 | ---------- |
| 649 | obj : Dataset or DataArray |
| 650 | Object to group. |
| 651 | grouper : Grouper |
| 652 | Grouper object |
| 653 | restore_coord_dims : bool, default: True |
| 654 | If True, also restore the dimension order of multi-dimensional |
| 655 | coordinates. |
| 656 | """ |
| 657 | self._original_obj = obj |
| 658 | self._restore_coord_dims = restore_coord_dims |
| 659 | self.groupers = groupers |
| 660 | |
| 661 | if len(groupers) == 1: |
| 662 | (grouper,) = groupers |
| 663 | self.encoded = grouper.encoded |
| 664 | else: |
| 665 | if any( |
| 666 | isinstance(obj._indexes.get(grouper.name, None), PandasMultiIndex) |
| 667 | for grouper in groupers |
| 668 | ): |
| 669 | raise NotImplementedError( |
| 670 | "Grouping by multiple variables, one of which " |
| 671 | "wraps a Pandas MultiIndex, is not supported yet." |
| 672 | ) |
| 673 | self.encoded = ComposedGrouper(groupers).factorize() |
| 674 | |
| 675 | # specification for the groupby operation |
| 676 | # TODO: handle obj having variables that are not present on any of the groupers |
| 677 | # simple broadcasting fails for ExtensionArrays. |
| 678 | codes = self.encoded.codes |
| 679 | self._by_chunked = is_chunked_array(codes._variable._data) |
| 680 | if not self._by_chunked: |
| 681 | (self.group1d, self._obj, self._stacked_dim, self._inserted_dims) = ( |
| 682 | _ensure_1d(group=codes, obj=obj) |
| 683 | ) |
| 684 | (self._group_dim,) = self.group1d.dims |
| 685 | else: |
| 686 | self.group1d = None |
| 687 | # This transpose preserves dim order behaviour |
| 688 | self._obj = obj.transpose(..., *codes.dims) |
| 689 | self._stacked_dim = None |
| 690 | self._inserted_dims = [] |
| 691 | self._group_dim = None |
| 692 | |
| 693 | # cached attributes |
| 694 | self._groups = None |
| 695 | self._dims = None |
| 696 | self._sizes = None |
nothing calls this directly
no test coverage detected