diff --git a/pandas/core/groupby/generic.py b/pandas/core/groupby/generic.py index 695823e29ef1b..80eaa4cbb1ab8 100644 --- a/pandas/core/groupby/generic.py +++ b/pandas/core/groupby/generic.py @@ -262,7 +262,7 @@ def aggregate(self, func=None, *args, **kwargs): try: return self._python_agg_general(func, *args, **kwargs) - except (AssertionError, TypeError): + except (AssertionError, TypeError, AttributeError): raise except (ValueError, KeyError, AttributeError, IndexError): # TODO: IndexError can be removed here following GH#29106 diff --git a/pandas/core/groupby/ops.py b/pandas/core/groupby/ops.py index fbe1598767736..f6a763b317829 100644 --- a/pandas/core/groupby/ops.py +++ b/pandas/core/groupby/ops.py @@ -679,12 +679,6 @@ def agg_series(self, obj, func): pass else: raise - except TypeError as err: - if "ndarray" in str(err): - # raised in libreduction if obj's values is no ndarray - pass - else: - raise return self._aggregate_series_pure_python(obj, func) def _aggregate_series_fast(self, obj, func): diff --git a/pandas/core/indexes/datetimelike.py b/pandas/core/indexes/datetimelike.py index bf89bbbdf2b79..a0237f059dea3 100644 --- a/pandas/core/indexes/datetimelike.py +++ b/pandas/core/indexes/datetimelike.py @@ -731,7 +731,9 @@ def astype(self, dtype, copy=True): # Ensure that self.astype(self.dtype) is self return self - new_values = self._data.astype(dtype, copy=copy) + # use _eadata since _data links to _index_data which can be + # overwritten in groupby-reduction + new_values = self._eadata.astype(dtype, copy=copy) # pass copy=False because any copying will be done in the # _data.astype call above diff --git a/pandas/core/indexes/datetimes.py b/pandas/core/indexes/datetimes.py index ee2f4e0f1e85d..96b72d31a55b8 100644 --- a/pandas/core/indexes/datetimes.py +++ b/pandas/core/indexes/datetimes.py @@ -368,6 +368,8 @@ def _simple_new(cls, values, name=None, freq=None, tz=None, dtype=None): result.name = name # For groupby perf. See note in indexes/base about _index_data result._index_data = dtarr._data + result._eadata = dtarr + result._reset_identity() return result diff --git a/pandas/core/indexes/period.py b/pandas/core/indexes/period.py index a20290e77023a..5bb6e60584e0c 100644 --- a/pandas/core/indexes/period.py +++ b/pandas/core/indexes/period.py @@ -298,6 +298,8 @@ def _simple_new(cls, values, name=None, freq=None, **kwargs): result._data = values # For groupby perf. See note in indexes/base about _index_data result._index_data = values._data + result._eadata = values + result.name = name result._reset_identity() return result diff --git a/pandas/core/indexes/timedeltas.py b/pandas/core/indexes/timedeltas.py index 2324b8cf74c46..c655badac67ca 100644 --- a/pandas/core/indexes/timedeltas.py +++ b/pandas/core/indexes/timedeltas.py @@ -273,6 +273,7 @@ def _simple_new(cls, values, name=None, freq=None, dtype=_TD_DTYPE): result.name = name # For groupby perf. See note in indexes/base about _index_data result._index_data = tdarr._data + result._eadata = tdarr result._reset_identity() return result