(
self,
index: Index,
grouper=None,
obj: NDFrame | None = None,
level=None,
sort: bool = True,
observed: bool = False,
in_axis: bool = False,
dropna: bool = True,
uniques: ArrayLike | None = None,
)
| 448 | _index: Index |
| 449 | |
| 450 | def __init__( |
| 451 | self, |
| 452 | index: Index, |
| 453 | grouper=None, |
| 454 | obj: NDFrame | None = None, |
| 455 | level=None, |
| 456 | sort: bool = True, |
| 457 | observed: bool = False, |
| 458 | in_axis: bool = False, |
| 459 | dropna: bool = True, |
| 460 | uniques: ArrayLike | None = None, |
| 461 | ) -> None: |
| 462 | if isinstance(grouper, Series): |
| 463 | grouper = grouper.copy(deep=False) |
| 464 | self.level = level |
| 465 | self._orig_grouper = grouper |
| 466 | grouping_vector = _convert_grouper(index, grouper) |
| 467 | self._orig_cats = None |
| 468 | self._index = index |
| 469 | self._sort = sort |
| 470 | self.obj = obj |
| 471 | self._observed = observed |
| 472 | self.in_axis = in_axis |
| 473 | self._dropna = dropna |
| 474 | self._uniques = uniques |
| 475 | |
| 476 | # we have a single grouper which may be a myriad of things, |
| 477 | # some of which are dependent on the passing in level |
| 478 | |
| 479 | ilevel = self._ilevel |
| 480 | if ilevel is not None: |
| 481 | # In extant tests, the new self.grouping_vector matches |
| 482 | # `index.get_level_values(ilevel)` whenever |
| 483 | # mapper is None and isinstance(index, MultiIndex) |
| 484 | if isinstance(index, MultiIndex): |
| 485 | index_level = index.get_level_values(ilevel) |
| 486 | else: |
| 487 | index_level = index |
| 488 | |
| 489 | if grouping_vector is None: |
| 490 | grouping_vector = index_level |
| 491 | else: |
| 492 | mapper = grouping_vector |
| 493 | grouping_vector = index_level.map(mapper) |
| 494 | |
| 495 | # a passed Grouper like, directly get the grouper in the same way |
| 496 | # as single grouper groupby, use the group_info to get codes |
| 497 | elif isinstance(grouping_vector, Grouper): |
| 498 | # get the new grouper; we already have disambiguated |
| 499 | # what key/level refer to exactly, don't need to |
| 500 | # check again as we have by this point converted these |
| 501 | # to an actual value (rather than a pd.Grouper) |
| 502 | assert self.obj is not None # for mypy |
| 503 | newgrouper, newobj = grouping_vector._get_grouper(self.obj, validate=False) |
| 504 | self.obj = newobj |
| 505 | |
| 506 | if isinstance(newgrouper, ops.BinGrouper): |
| 507 | # TODO: can we unwrap this and get a tighter typing |
nothing calls this directly
no test coverage detected