Skip to content

Commit 33eb725

Browse files
author
Jon M. Mease
committed
Cleaned up _get_grouper_for_level implementations and added docstrings
1 parent 05e6557 commit 33eb725

File tree

2 files changed

+62
-28
lines changed

2 files changed

+62
-28
lines changed

pandas/indexes/base.py

+25-7
Original file line numberDiff line numberDiff line change
@@ -432,15 +432,33 @@ def _update_inplace(self, result, **kwargs):
432432
# guard when called from IndexOpsMixin
433433
raise TypeError("Index can't be updated inplace")
434434

435-
def _get_grouper_for_level(self, grouper, level):
436-
# Use self (Index) as grouper if None was passed
437-
if grouper is None:
435+
def _get_grouper_for_level(self, group_mapper, level):
436+
"""
437+
Get index grouper corresponding to an index level
438+
439+
Parameters
440+
----------
441+
group_mapper: Group mapping function or None
442+
Function mapping index values to groups
443+
level : int
444+
Index level (Only used by MultiIndex override)
445+
446+
Returns
447+
-------
448+
grouper : Index
449+
Index of values to group on
450+
labels : None
451+
Array of locations in level_index
452+
(Only returned by MultiIndex override)
453+
level_index : None
454+
Index of unique values for level
455+
(Only returned by MultiIndex override)
456+
"""
457+
if group_mapper is None:
438458
grouper = self
459+
else:
460+
grouper = self.map(group_mapper)
439461

440-
# Return tuple of (grouper, labels, level_index)
441-
# where labels and level_index are None for the Index
442-
# implementation. The labels and level_index values
443-
# are only calculated in the MultiIndex implementation
444462
return grouper, None, None
445463

446464
def is_(self, other):

pandas/indexes/multi.py

+37-21
Original file line numberDiff line numberDiff line change
@@ -524,36 +524,52 @@ def _format_native_types(self, na_rep='nan', **kwargs):
524524

525525
return mi.values
526526

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
528530
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+
"""
529547
inds = self.labels[level]
530548
level_index = self.levels[level]
531549

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
535552
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)
542557

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)
548563

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
552567

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)
555571

556-
grouper = level_index.take(labels)
572+
grouper = level_index.take(labels)
557573

558574
return grouper, labels, level_index
559575

0 commit comments

Comments
 (0)