diff --git a/pandas/_libs/reduction.pyx b/pandas/_libs/reduction.pyx index e6e658c0c6979..07b95c81cc9a4 100644 --- a/pandas/_libs/reduction.pyx +++ b/pandas/_libs/reduction.pyx @@ -194,6 +194,23 @@ cdef class _BaseGrouper: return values, index + cdef inline _update_cached_objs(self, object cached_typ, object cached_ityp, + Slider islider, Slider vslider, object name): + if cached_typ is None: + cached_ityp = self.ityp(islider.buf) + cached_typ = self.typ(vslider.buf, index=cached_ityp, name=name) + else: + # See the comment in indexes/base.py about _index_data. + # We need this for EA-backed indexes that have a reference + # to a 1-d ndarray like datetime / timedelta / period. + object.__setattr__(cached_ityp, '_index_data', islider.buf) + cached_ityp._engine.clear_mapping() + object.__setattr__(cached_typ._data._block, 'values', vslider.buf) + object.__setattr__(cached_typ, '_index', cached_ityp) + object.__setattr__(cached_typ, 'name', name) + + return cached_typ, cached_ityp + cdef class SeriesBinGrouper(_BaseGrouper): """ @@ -265,20 +282,8 @@ cdef class SeriesBinGrouper(_BaseGrouper): islider.set_length(group_size) vslider.set_length(group_size) - if cached_typ is None: - cached_ityp = self.ityp(islider.buf) - cached_typ = self.typ(vslider.buf, index=cached_ityp, - name=name) - else: - # See the comment in indexes/base.py about _index_data. - # We need this for EA-backed indexes that have a reference - # to a 1-d ndarray like datetime / timedelta / period. - object.__setattr__(cached_ityp, '_index_data', islider.buf) - cached_ityp._engine.clear_mapping() - object.__setattr__( - cached_typ._data._block, 'values', vslider.buf) - object.__setattr__(cached_typ, '_index', cached_ityp) - object.__setattr__(cached_typ, 'name', name) + cached_typ, cached_ityp = self._update_cached_objs( + cached_typ, cached_ityp, islider, vslider, name) cached_ityp._engine.clear_mapping() res = self.f(cached_typ) @@ -375,17 +380,8 @@ cdef class SeriesGrouper(_BaseGrouper): islider.set_length(group_size) vslider.set_length(group_size) - if cached_typ is None: - cached_ityp = self.ityp(islider.buf) - cached_typ = self.typ(vslider.buf, index=cached_ityp, - name=name) - else: - object.__setattr__(cached_ityp, '_data', islider.buf) - cached_ityp._engine.clear_mapping() - object.__setattr__( - cached_typ._data._block, 'values', vslider.buf) - object.__setattr__(cached_typ, '_index', cached_ityp) - object.__setattr__(cached_typ, 'name', name) + cached_typ, cached_ityp = self._update_cached_objs( + cached_typ, cached_ityp, islider, vslider, name) cached_ityp._engine.clear_mapping() res = self.f(cached_typ)