From 155406fd633f9ce615614d8da62ea6e8392eb225 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Tue, 22 Oct 2019 08:06:34 -0700 Subject: [PATCH 1/2] BUG: AttributeError raised by map inside groupby reduction --- pandas/core/groupby/generic.py | 2 +- pandas/core/indexes/datetimelike.py | 4 +++- pandas/core/indexes/datetimes.py | 2 ++ pandas/core/indexes/period.py | 2 ++ pandas/core/indexes/timedeltas.py | 1 + 5 files changed, 9 insertions(+), 2 deletions(-) diff --git a/pandas/core/groupby/generic.py b/pandas/core/groupby/generic.py index 5c7c56e2a31df..6fb63daf018ce 100644 --- a/pandas/core/groupby/generic.py +++ b/pandas/core/groupby/generic.py @@ -261,7 +261,7 @@ def aggregate(self, func=None, *args, **kwargs): try: return self._python_agg_general(func, *args, **kwargs) - except AssertionError: + except (AssertionError, AttributeError): raise except Exception: result = self._aggregate_named(func, *args, **kwargs) 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 From 4582436c6b54fee560cabfa00084e5a3149a1654 Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Thu, 24 Oct 2019 11:02:39 -0700 Subject: [PATCH 2/2] CLN: revert catch --- pandas/core/groupby/ops.py | 6 ------ 1 file changed, 6 deletions(-) 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):