given an object and the specifications, setup the internal grouper for this particular specification Parameters ---------- obj : Series or DataFrame sort : bool, default False whether the resulting grouper should be sorted gpr_ind
(
self, obj: NDFrameT, sort: bool = False, *, gpr_index: Index | None = None
)
| 319 | return grouper, obj |
| 320 | |
| 321 | def _set_grouper( |
| 322 | self, obj: NDFrameT, sort: bool = False, *, gpr_index: Index | None = None |
| 323 | ) -> tuple[NDFrameT, Index, npt.NDArray[np.intp] | None]: |
| 324 | """ |
| 325 | given an object and the specifications, setup the internal grouper |
| 326 | for this particular specification |
| 327 | |
| 328 | Parameters |
| 329 | ---------- |
| 330 | obj : Series or DataFrame |
| 331 | sort : bool, default False |
| 332 | whether the resulting grouper should be sorted |
| 333 | gpr_index : Index or None, default None |
| 334 | |
| 335 | Returns |
| 336 | ------- |
| 337 | NDFrame |
| 338 | Index |
| 339 | np.ndarray[np.intp] | None |
| 340 | """ |
| 341 | assert obj is not None |
| 342 | |
| 343 | if self.key is not None and self.level is not None: |
| 344 | raise ValueError("The Grouper cannot specify both a key and a level!") |
| 345 | |
| 346 | # Keep self._grouper value before overriding |
| 347 | if self._grouper is None: |
| 348 | # TODO: What are we assuming about subsequent calls? |
| 349 | self._grouper = gpr_index |
| 350 | self._indexer = self._indexer_deprecated |
| 351 | |
| 352 | # the key must be a valid info item |
| 353 | if self.key is not None: |
| 354 | key = self.key |
| 355 | # The 'on' is already defined |
| 356 | if getattr(gpr_index, "name", None) == key and isinstance(obj, Series): |
| 357 | # Sometimes self._grouper will have been resorted while |
| 358 | # obj has not. In this case there is a mismatch when we |
| 359 | # call self._grouper.take(obj.index) so we need to undo the sorting |
| 360 | # before we call _grouper.take. |
| 361 | assert self._grouper is not None |
| 362 | if self._indexer is not None: |
| 363 | reverse_indexer = self._indexer.argsort() |
| 364 | unsorted_ax = self._grouper.take(reverse_indexer) |
| 365 | ax = unsorted_ax.take(obj.index) |
| 366 | else: |
| 367 | ax = self._grouper.take(obj.index) |
| 368 | else: |
| 369 | if key not in obj._info_axis: |
| 370 | raise KeyError(f"The grouper name {key} is not found") |
| 371 | ax = Index(obj[key], name=key) |
| 372 | |
| 373 | else: |
| 374 | ax = obj.index |
| 375 | if self.level is not None: |
| 376 | level = self.level |
| 377 | |
| 378 | # if a level is given it must be a mi level or |
no test coverage detected