@@ -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 ,
0 commit comments