From 3def19b3db47fa5e9f6aec4b64037b10f5fdc627 Mon Sep 17 00:00:00 2001 From: Kenil Mehta Date: Sun, 12 Apr 2020 09:28:08 +0000 Subject: [PATCH] Preserving dtype in Series.any/all function with level keyword #33449 --- pandas/core/generic.py | 14 +++++++++----- pandas/tests/reductions/test_reductions.py | 9 +++++++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 2adfd2bb9a7b3..db880368fffed 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -9974,11 +9974,15 @@ def _agg_by_level(self, name, axis=0, level=0, skipna=True, **kwargs): raise ValueError("Must specify 'axis' when aggregating by level.") grouped = self.groupby(level=level, axis=axis, sort=False) if hasattr(grouped, name) and skipna: - return getattr(grouped, name)(**kwargs) - axis = self._get_axis_number(axis) - method = getattr(type(self), name) - applyf = lambda x: method(x, axis=axis, skipna=skipna, **kwargs) - return grouped.aggregate(applyf) + result = getattr(grouped, name)(**kwargs) + else: + axis = self._get_axis_number(axis) + method = getattr(type(self), name) + applyf = lambda x: method(x, axis=axis, skipna=skipna, **kwargs) + result = grouped.aggregate(applyf) + if isinstance(self, ABCSeries) and self.dtype.name == "boolean": + return result.astype("boolean") + return result @classmethod def _add_numeric_operations(cls): diff --git a/pandas/tests/reductions/test_reductions.py b/pandas/tests/reductions/test_reductions.py index fa62d5d8c4983..ead8183bb7d8f 100644 --- a/pandas/tests/reductions/test_reductions.py +++ b/pandas/tests/reductions/test_reductions.py @@ -912,8 +912,13 @@ def test_all_any_boolean(self): index=[0, 0, 1, 1, 2, 2], dtype="boolean", ) - tm.assert_series_equal(s.all(level=0), Series([False, True, False])) - tm.assert_series_equal(s.any(level=0), Series([False, True, True])) + result = s.all(level=0) + expected = Series([False, True, False], dtype="boolean") + tm.assert_series_equal(result, expected) + + result = s.any(level=0) + expected = Series([False, True, True], dtype="boolean") + tm.assert_series_equal(result, expected) def test_timedelta64_analytics(self):