Skip to content

Commit f5ead01

Browse files
jbrockmendelTLouf
authored andcommitted
REF: remove name arg from Grouping (pandas-dev#41426)
1 parent c22c242 commit f5ead01

File tree

2 files changed

+39
-25
lines changed

2 files changed

+39
-25
lines changed

pandas/core/groupby/grouper.py

+38-24
Original file line numberDiff line numberDiff line change
@@ -446,15 +446,14 @@ def __init__(
446446
index: Index,
447447
grouper=None,
448448
obj: FrameOrSeries | None = None,
449-
name: Hashable = None,
450449
level=None,
451450
sort: bool = True,
452451
observed: bool = False,
453452
in_axis: bool = False,
454453
dropna: bool = True,
455454
):
456-
self.name = name
457455
self.level = level
456+
self._orig_grouper = grouper
458457
self.grouper = _convert_grouper(index, grouper)
459458
self.all_grouper = None
460459
self.index = index
@@ -466,18 +465,11 @@ def __init__(
466465

467466
self._passed_categorical = False
468467

469-
# right place for this?
470-
if isinstance(grouper, (Series, Index)) and name is None:
471-
self.name = grouper.name
472-
473468
# we have a single grouper which may be a myriad of things,
474469
# some of which are dependent on the passing in level
475470

476471
ilevel = self._ilevel
477472
if ilevel is not None:
478-
if self.name is None:
479-
self.name = index.names[ilevel]
480-
481473
(
482474
self.grouper, # Index
483475
self._codes,
@@ -491,16 +483,22 @@ def __init__(
491483
# what key/level refer to exactly, don't need to
492484
# check again as we have by this point converted these
493485
# to an actual value (rather than a pd.Grouper)
494-
_, grouper, _ = self.grouper._get_grouper(
486+
_, newgrouper, newobj = self.grouper._get_grouper(
495487
# error: Value of type variable "FrameOrSeries" of "_get_grouper"
496488
# of "Grouper" cannot be "Optional[FrameOrSeries]"
497489
self.obj, # type: ignore[type-var]
498490
validate=False,
499491
)
500-
if self.name is None:
501-
self.name = grouper.result_index.name
502-
self.obj = self.grouper.obj
503-
self.grouper = grouper._get_grouper()
492+
self.obj = newobj
493+
494+
ng = newgrouper._get_grouper()
495+
if isinstance(newgrouper, ops.BinGrouper):
496+
# in this case we have `ng is newgrouper`
497+
self.grouper = ng
498+
else:
499+
# ops.BaseGrouper
500+
# use Index instead of ndarray so we can recover the name
501+
self.grouper = Index(ng, name=newgrouper.result_index.name)
504502

505503
else:
506504
# a passed Categorical
@@ -511,10 +509,6 @@ def __init__(
511509
self.grouper, self.sort, observed
512510
)
513511

514-
# we are done
515-
elif isinstance(self.grouper, Grouping):
516-
self.grouper = self.grouper.grouper
517-
518512
# no level passed
519513
elif not isinstance(
520514
self.grouper, (Series, Index, ExtensionArray, np.ndarray)
@@ -546,6 +540,23 @@ def __repr__(self) -> str:
546540
def __iter__(self):
547541
return iter(self.indices)
548542

543+
@cache_readonly
544+
def name(self) -> Hashable:
545+
ilevel = self._ilevel
546+
if ilevel is not None:
547+
return self.index.names[ilevel]
548+
549+
if isinstance(self._orig_grouper, (Index, Series)):
550+
return self._orig_grouper.name
551+
552+
elif isinstance(self.grouper, ops.BaseGrouper):
553+
return self.grouper.result_index.name
554+
555+
elif isinstance(self.grouper, Index):
556+
return self.grouper.name
557+
558+
return None
559+
549560
@cache_readonly
550561
def _ilevel(self) -> int | None:
551562
"""
@@ -814,25 +825,29 @@ def is_in_obj(gpr) -> bool:
814825
for gpr, level in zip(keys, levels):
815826

816827
if is_in_obj(gpr): # df.groupby(df['name'])
817-
in_axis, name = True, gpr.name
818-
exclusions.add(name)
828+
in_axis = True
829+
exclusions.add(gpr.name)
819830

820831
elif is_in_axis(gpr): # df.groupby('name')
821832
if gpr in obj:
822833
if validate:
823834
obj._check_label_or_level_ambiguity(gpr, axis=axis)
824835
in_axis, name, gpr = True, gpr, obj[gpr]
836+
if gpr.ndim != 1:
837+
# non-unique columns; raise here to get the name in the
838+
# exception message
839+
raise ValueError(f"Grouper for '{name}' not 1-dimensional")
825840
exclusions.add(name)
826841
elif obj._is_level_reference(gpr, axis=axis):
827-
in_axis, name, level, gpr = False, None, gpr, None
842+
in_axis, level, gpr = False, gpr, None
828843
else:
829844
raise KeyError(gpr)
830845
elif isinstance(gpr, Grouper) and gpr.key is not None:
831846
# Add key to exclusions
832847
exclusions.add(gpr.key)
833-
in_axis, name = False, None
848+
in_axis = False
834849
else:
835-
in_axis, name = False, None
850+
in_axis = False
836851

837852
if is_categorical_dtype(gpr) and len(gpr) != obj.shape[axis]:
838853
raise ValueError(
@@ -847,7 +862,6 @@ def is_in_obj(gpr) -> bool:
847862
group_axis,
848863
gpr,
849864
obj=obj,
850-
name=name,
851865
level=level,
852866
sort=sort,
853867
observed=observed,

pandas/core/groupby/ops.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1200,7 +1200,7 @@ def names(self) -> list[Hashable]:
12001200
@property
12011201
def groupings(self) -> list[grouper.Grouping]:
12021202
lev = self.binlabels
1203-
ping = grouper.Grouping(lev, lev, in_axis=False, level=None, name=lev.name)
1203+
ping = grouper.Grouping(lev, lev, in_axis=False, level=None)
12041204
return [ping]
12051205

12061206
def _aggregate_series_fast(self, obj: Series, func: F) -> np.ndarray:

0 commit comments

Comments
 (0)