@@ -256,11 +256,13 @@ def __init__(self, key=None, level=None, freq=None, axis=0, sort=False):
256
256
def ax (self ):
257
257
return self .grouper
258
258
259
- def _get_grouper (self , obj ):
259
+ def _get_grouper (self , obj , validate = True ):
260
260
"""
261
261
Parameters
262
262
----------
263
263
obj : the subject object
264
+ validate : boolean, default True
265
+ if True, validate the grouper
264
266
265
267
Returns
266
268
-------
@@ -271,7 +273,8 @@ def _get_grouper(self, obj):
271
273
self .grouper , exclusions , self .obj = _get_grouper (self .obj , [self .key ],
272
274
axis = self .axis ,
273
275
level = self .level ,
274
- sort = self .sort )
276
+ sort = self .sort ,
277
+ validate = validate )
275
278
return self .binner , self .grouper , self .obj
276
279
277
280
def _set_grouper (self , obj , sort = False ):
@@ -1739,8 +1742,9 @@ class BaseGrouper(object):
1739
1742
whether this grouper will give sorted result or not
1740
1743
group_keys : boolean, default True
1741
1744
mutated : boolean, default False
1742
- indexer : the indexer created by Grouper
1743
- some grouper (TimeGrouper eg) will sort its axis and its
1745
+ indexer : intp array, optional
1746
+ the indexer created by Grouper
1747
+ some groupers (TimeGrouper) will sort its axis and its
1744
1748
group_info is also sorted, so need the indexer to reorder
1745
1749
1746
1750
"""
@@ -2514,8 +2518,11 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None,
2514
2518
# a passed Grouper like, directly get the grouper in the same way
2515
2519
# as single grouper groupby, use the group_info to get labels
2516
2520
elif isinstance (self .grouper , Grouper ):
2517
- # get the new grouper
2518
- _ , grouper , _ = self .grouper ._get_grouper (self .obj )
2521
+ # get the new grouper; we already have disambiguated
2522
+ # what key/level refer to exactly, don't need to
2523
+ # check again as we have by this point converted these
2524
+ # to an actual value (rather than a pd.Grouper)
2525
+ _ , grouper , _ = self .grouper ._get_grouper (self .obj , validate = False )
2519
2526
if self .name is None :
2520
2527
self .name = grouper .result_index .name
2521
2528
self .obj = self .grouper .obj
@@ -2587,12 +2594,12 @@ def ngroups(self):
2587
2594
2588
2595
@cache_readonly
2589
2596
def indices (self ):
2590
- # for the situation of groupby list of groupers
2597
+ # we have a list of groupers
2591
2598
if isinstance (self .grouper , BaseGrouper ):
2592
2599
return self .grouper .indices
2593
- else :
2594
- values = _ensure_categorical (self .grouper )
2595
- return values ._reverse_indexer ()
2600
+
2601
+ values = _ensure_categorical (self .grouper )
2602
+ return values ._reverse_indexer ()
2596
2603
2597
2604
@property
2598
2605
def labels (self ):
@@ -2608,7 +2615,7 @@ def group_index(self):
2608
2615
2609
2616
def _make_labels (self ):
2610
2617
if self ._labels is None or self ._group_index is None :
2611
- # for the situation of groupby list of groupers
2618
+ # we have a list of groupers
2612
2619
if isinstance (self .grouper , BaseGrouper ):
2613
2620
labels = self .grouper .label_info
2614
2621
uniques = self .grouper .result_index
@@ -2626,7 +2633,7 @@ def groups(self):
2626
2633
2627
2634
2628
2635
def _get_grouper (obj , key = None , axis = 0 , level = None , sort = True ,
2629
- mutated = False ):
2636
+ mutated = False , validate = True ):
2630
2637
"""
2631
2638
create and return a BaseGrouper, which is an internal
2632
2639
mapping of how to create the grouper indexers.
@@ -2643,6 +2650,8 @@ def _get_grouper(obj, key=None, axis=0, level=None, sort=True,
2643
2650
are and then creates a Grouping for each one, combined into
2644
2651
a BaseGrouper.
2645
2652
2653
+ If validate, then check for key/level overlaps
2654
+
2646
2655
"""
2647
2656
group_axis = obj ._get_axis (axis )
2648
2657
@@ -2767,7 +2776,7 @@ def is_in_obj(gpr):
2767
2776
2768
2777
elif is_in_axis (gpr ): # df.groupby('name')
2769
2778
if gpr in obj :
2770
- if gpr in obj .index .names :
2779
+ if validate and gpr in obj .index .names :
2771
2780
warnings .warn (
2772
2781
("'%s' is both a column name and an index level.\n "
2773
2782
"Defaulting to column but "
0 commit comments