@@ -524,36 +524,52 @@ def _format_native_types(self, na_rep='nan', **kwargs):
524
524
525
525
return mi .values
526
526
527
- def _get_grouper_for_level (self , grouper , level ):
527
+ def _get_grouper_for_level (self , group_mapper , level ):
528
+ """
529
+ Get index grouper corresponding to an index level
528
530
531
+ Parameters
532
+ ----------
533
+ group_mapper: Group mapping function or None
534
+ Function mapping index values to groups
535
+ level : int
536
+ Index level
537
+
538
+ Returns
539
+ -------
540
+ grouper : Index
541
+ Index of values to group on
542
+ labels : ndarray of int or None
543
+ Array of locations in level_index
544
+ level_index : Index or None
545
+ Index of unique values for level
546
+ """
529
547
inds = self .labels [level ]
530
548
level_index = self .levels [level ]
531
549
532
- # XXX complete hack
533
-
534
- if grouper is not None :
550
+ if group_mapper is not None :
551
+ # Handle group mapping function and return
535
552
level_values = self .levels [level ].take (inds )
536
- grouper = level_values .map (grouper )
537
- labels = None
538
- level_index = None
539
- else :
540
- # all levels may not be observed
541
- labels , uniques = algos .factorize (inds , sort = True )
553
+ grouper = level_values .map (group_mapper )
554
+ return grouper , None , None
555
+
556
+ labels , uniques = algos .factorize (inds , sort = True )
542
557
543
- if len (uniques ) > 0 and uniques [0 ] == - 1 :
544
- # handle NAs
545
- mask = inds != - 1
546
- ok_labels , uniques = algos .factorize (inds [mask ],
547
- sort = True )
558
+ if len (uniques ) > 0 and uniques [0 ] == - 1 :
559
+ # Handle NAs
560
+ mask = inds != - 1
561
+ ok_labels , uniques = algos .factorize (inds [mask ],
562
+ sort = True )
548
563
549
- labels = np .empty (len (inds ), dtype = inds .dtype )
550
- labels [mask ] = ok_labels
551
- labels [~ mask ] = - 1
564
+ labels = np .empty (len (inds ), dtype = inds .dtype )
565
+ labels [mask ] = ok_labels
566
+ labels [~ mask ] = - 1
552
567
553
- if len (uniques ) < len (level_index ):
554
- level_index = level_index .take (uniques )
568
+ if len (uniques ) < len (level_index ):
569
+ # Remove unobserved levels from level_index
570
+ level_index = level_index .take (uniques )
555
571
556
- grouper = level_index .take (labels )
572
+ grouper = level_index .take (labels )
557
573
558
574
return grouper , labels , level_index
559
575
0 commit comments