Skip to content

Commit 66febe4

Browse files
ruiannjreback
authored andcommitted
BinGrouper holds the sorted binners, give the indexer to reorder axis if needed, eg. build grouping labels
1 parent 6838d9c commit 66febe4

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

pandas/core/groupby.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1730,13 +1730,14 @@ class BaseGrouper(object):
17301730
"""
17311731

17321732
def __init__(self, axis, groupings, sort=True, group_keys=True,
1733-
mutated=False):
1733+
mutated=False, indexer=None):
17341734
self._filter_empty_groups = self.compressed = len(groupings) != 1
17351735
self.axis = axis
17361736
self.groupings = groupings
17371737
self.sort = sort
17381738
self.group_keys = group_keys
17391739
self.mutated = mutated
1740+
self.indexer = indexer
17401741

17411742
@property
17421743
def shape(self):
@@ -2282,11 +2283,12 @@ def generate_bins_generic(values, binner, closed):
22822283

22832284
class BinGrouper(BaseGrouper):
22842285

2285-
def __init__(self, bins, binlabels, filter_empty=False, mutated=False):
2286+
def __init__(self, bins, binlabels, filter_empty=False, mutated=False, indexer=None):
22862287
self.bins = _ensure_int64(bins)
22872288
self.binlabels = _ensure_index(binlabels)
22882289
self._filter_empty_groups = filter_empty
22892290
self.mutated = mutated
2291+
self.indexer = indexer
22902292

22912293
@cache_readonly
22922294
def groups(self):
@@ -2554,6 +2556,9 @@ def _make_labels(self):
25542556
if isinstance(self.grouper, BaseGrouper):
25552557
labels, _, _ = self.grouper.group_info
25562558
uniques = self.grouper.result_index
2559+
if self.grouper.indexer is not None:
2560+
sorter = np.lexsort((labels, self.grouper.indexer))
2561+
labels = labels[sorter]
25572562
else:
25582563
labels, uniques = algorithms.factorize(
25592564
self.grouper, sort=self.sort)

pandas/core/resample.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ def _get_binner(self):
250250
"""
251251

252252
binner, bins, binlabels = self._get_binner_for_time()
253-
bin_grouper = BinGrouper(bins, binlabels)
253+
bin_grouper = BinGrouper(bins, binlabels, indexer=self.groupby.indexer)
254254
return binner, bin_grouper
255255

256256
def _assure_grouper(self):
@@ -879,7 +879,14 @@ def _downsample(self, how, **kwargs):
879879

880880
if is_subperiod(ax.freq, self.freq):
881881
# Downsampling
882-
return self._groupby_and_aggregate(how, grouper=self.grouper)
882+
if len(new_index) == 0:
883+
bins = []
884+
else:
885+
i8 = memb.asi8
886+
rng = np.arange(i8[0], i8[-1] + 1)
887+
bins = memb.searchsorted(rng, side='right')
888+
grouper = BinGrouper(bins, new_index, indexer=self.groupby.indexer)
889+
return self._groupby_and_aggregate(how, grouper=grouper)
883890
elif is_superperiod(ax.freq, self.freq):
884891
if how == 'ohlc':
885892
# GH #13083

0 commit comments

Comments
 (0)