@@ -446,15 +446,14 @@ def __init__(
446
446
index : Index ,
447
447
grouper = None ,
448
448
obj : FrameOrSeries | None = None ,
449
- name : Hashable = None ,
450
449
level = None ,
451
450
sort : bool = True ,
452
451
observed : bool = False ,
453
452
in_axis : bool = False ,
454
453
dropna : bool = True ,
455
454
):
456
- self .name = name
457
455
self .level = level
456
+ self ._orig_grouper = grouper
458
457
self .grouper = _convert_grouper (index , grouper )
459
458
self .all_grouper = None
460
459
self .index = index
@@ -466,18 +465,11 @@ def __init__(
466
465
467
466
self ._passed_categorical = False
468
467
469
- # right place for this?
470
- if isinstance (grouper , (Series , Index )) and name is None :
471
- self .name = grouper .name
472
-
473
468
# we have a single grouper which may be a myriad of things,
474
469
# some of which are dependent on the passing in level
475
470
476
471
ilevel = self ._ilevel
477
472
if ilevel is not None :
478
- if self .name is None :
479
- self .name = index .names [ilevel ]
480
-
481
473
(
482
474
self .grouper , # Index
483
475
self ._codes ,
@@ -491,16 +483,22 @@ def __init__(
491
483
# what key/level refer to exactly, don't need to
492
484
# check again as we have by this point converted these
493
485
# to an actual value (rather than a pd.Grouper)
494
- _ , grouper , _ = self .grouper ._get_grouper (
486
+ _ , newgrouper , newobj = self .grouper ._get_grouper (
495
487
# error: Value of type variable "FrameOrSeries" of "_get_grouper"
496
488
# of "Grouper" cannot be "Optional[FrameOrSeries]"
497
489
self .obj , # type: ignore[type-var]
498
490
validate = False ,
499
491
)
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 )
504
502
505
503
else :
506
504
# a passed Categorical
@@ -511,10 +509,6 @@ def __init__(
511
509
self .grouper , self .sort , observed
512
510
)
513
511
514
- # we are done
515
- elif isinstance (self .grouper , Grouping ):
516
- self .grouper = self .grouper .grouper
517
-
518
512
# no level passed
519
513
elif not isinstance (
520
514
self .grouper , (Series , Index , ExtensionArray , np .ndarray )
@@ -546,6 +540,23 @@ def __repr__(self) -> str:
546
540
def __iter__ (self ):
547
541
return iter (self .indices )
548
542
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
+
549
560
@cache_readonly
550
561
def _ilevel (self ) -> int | None :
551
562
"""
@@ -814,25 +825,29 @@ def is_in_obj(gpr) -> bool:
814
825
for gpr , level in zip (keys , levels ):
815
826
816
827
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 )
819
830
820
831
elif is_in_axis (gpr ): # df.groupby('name')
821
832
if gpr in obj :
822
833
if validate :
823
834
obj ._check_label_or_level_ambiguity (gpr , axis = axis )
824
835
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" )
825
840
exclusions .add (name )
826
841
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
828
843
else :
829
844
raise KeyError (gpr )
830
845
elif isinstance (gpr , Grouper ) and gpr .key is not None :
831
846
# Add key to exclusions
832
847
exclusions .add (gpr .key )
833
- in_axis , name = False , None
848
+ in_axis = False
834
849
else :
835
- in_axis , name = False , None
850
+ in_axis = False
836
851
837
852
if is_categorical_dtype (gpr ) and len (gpr ) != obj .shape [axis ]:
838
853
raise ValueError (
@@ -847,7 +862,6 @@ def is_in_obj(gpr) -> bool:
847
862
group_axis ,
848
863
gpr ,
849
864
obj = obj ,
850
- name = name ,
851
865
level = level ,
852
866
sort = sort ,
853
867
observed = observed ,
0 commit comments