From 66b1dddd43a33fa5129e7957c4f674cad815f4bc Mon Sep 17 00:00:00 2001 From: Brock Date: Fri, 25 Jun 2021 10:35:59 -0700 Subject: [PATCH] PERF: Avoid copy in DataFrame._reduce corner cases --- pandas/core/frame.py | 8 ++++++-- pandas/core/internals/managers.py | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 0acbb0c34266f..bf5cf8ce6da8a 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -9810,8 +9810,12 @@ def _reduce( FutureWarning, stacklevel=5, ) - cols = self.columns[~dtype_is_dt] - self = self[cols] + # Non-copy equivalent to + # cols = self.columns[~dtype_is_dt] + # self = self[cols] + predicate = lambda x: not is_datetime64_any_dtype(x.dtype) + mgr = self._mgr._get_data_subset(predicate) + self = type(self)(mgr) # TODO: Make other agg func handle axis=None properly GH#21597 axis = self._get_axis_number(axis) diff --git a/pandas/core/internals/managers.py b/pandas/core/internals/managers.py index 48f0b7f7f964b..cc9b2f069c6d4 100644 --- a/pandas/core/internals/managers.py +++ b/pandas/core/internals/managers.py @@ -479,6 +479,10 @@ def is_view(self) -> bool: return False + def _get_data_subset(self: T, predicate: Callable) -> T: + blocks = [blk for blk in self.blocks if predicate(blk.values)] + return self._combine(blocks, copy=False) + def get_bool_data(self: T, copy: bool = False) -> T: """ Select blocks that are bool-dtype and columns from object-dtype blocks