@@ -256,11 +256,13 @@ def __init__(self, key=None, level=None, freq=None, axis=0, sort=False):
256256 def ax (self ):
257257 return self .grouper
258258
259- def _get_grouper (self , obj ):
259+ def _get_grouper (self , obj , validate = True ):
260260 """
261261 Parameters
262262 ----------
263263 obj : the subject object
264+ validate : boolean, default True
265+ if True, validate the grouper
264266
265267 Returns
266268 -------
@@ -271,7 +273,8 @@ def _get_grouper(self, obj):
271273 self .grouper , exclusions , self .obj = _get_grouper (self .obj , [self .key ],
272274 axis = self .axis ,
273275 level = self .level ,
274- sort = self .sort )
276+ sort = self .sort ,
277+ validate = validate )
275278 return self .binner , self .grouper , self .obj
276279
277280 def _set_grouper (self , obj , sort = False ):
@@ -1739,8 +1742,9 @@ class BaseGrouper(object):
17391742 whether this grouper will give sorted result or not
17401743 group_keys : boolean, default True
17411744 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
17441748 group_info is also sorted, so need the indexer to reorder
17451749
17461750 """
@@ -2514,8 +2518,11 @@ def __init__(self, index, grouper=None, obj=None, name=None, level=None,
25142518 # a passed Grouper like, directly get the grouper in the same way
25152519 # as single grouper groupby, use the group_info to get labels
25162520 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 )
25192526 if self .name is None :
25202527 self .name = grouper .result_index .name
25212528 self .obj = self .grouper .obj
@@ -2587,12 +2594,12 @@ def ngroups(self):
25872594
25882595 @cache_readonly
25892596 def indices (self ):
2590- # for the situation of groupby list of groupers
2597+ # we have a list of groupers
25912598 if isinstance (self .grouper , BaseGrouper ):
25922599 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 ()
25962603
25972604 @property
25982605 def labels (self ):
@@ -2608,7 +2615,7 @@ def group_index(self):
26082615
26092616 def _make_labels (self ):
26102617 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
26122619 if isinstance (self .grouper , BaseGrouper ):
26132620 labels = self .grouper .label_info
26142621 uniques = self .grouper .result_index
@@ -2626,7 +2633,7 @@ def groups(self):
26262633
26272634
26282635def _get_grouper (obj , key = None , axis = 0 , level = None , sort = True ,
2629- mutated = False ):
2636+ mutated = False , validate = True ):
26302637 """
26312638 create and return a BaseGrouper, which is an internal
26322639 mapping of how to create the grouper indexers.
@@ -2643,6 +2650,8 @@ def _get_grouper(obj, key=None, axis=0, level=None, sort=True,
26432650 are and then creates a Grouping for each one, combined into
26442651 a BaseGrouper.
26452652
2653+ If validate, then check for key/level overlaps
2654+
26462655 """
26472656 group_axis = obj ._get_axis (axis )
26482657
@@ -2767,7 +2776,7 @@ def is_in_obj(gpr):
27672776
27682777 elif is_in_axis (gpr ): # df.groupby('name')
27692778 if gpr in obj :
2770- if gpr in obj .index .names :
2779+ if validate and gpr in obj .index .names :
27712780 warnings .warn (
27722781 ("'%s' is both a column name and an index level.\n "
27732782 "Defaulting to column but "
0 commit comments