Skip to content

Commit 57c6533

Browse files
authored
PERF: avoid unnecessary cast in Groupby.std with Float64 (pandas-dev#51021)
1 parent 01693d6 commit 57c6533

File tree

1 file changed

+15
-9
lines changed

1 file changed

+15
-9
lines changed

pandas/core/groupby/groupby.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2097,20 +2097,26 @@ def std(
20972097
f"numeric_only={numeric_only} and dtype {self.obj.dtype}"
20982098
)
20992099

2100+
def _preprocessing(values):
2101+
if isinstance(values, BaseMaskedArray):
2102+
return values._data, None
2103+
return values, None
2104+
21002105
def _postprocessing(
2101-
vals, inference, nullable: bool = False, mask=None
2106+
vals, inference, nullable: bool = False, result_mask=None
21022107
) -> ArrayLike:
21032108
if nullable:
2104-
if mask.ndim == 2:
2105-
mask = mask[:, 0]
2106-
return FloatingArray(np.sqrt(vals), mask.view(np.bool_))
2109+
if result_mask.ndim == 2:
2110+
result_mask = result_mask[:, 0]
2111+
return FloatingArray(np.sqrt(vals), result_mask.view(np.bool_))
21072112
return np.sqrt(vals)
21082113

21092114
result = self._get_cythonized_result(
21102115
libgroupby.group_var,
21112116
cython_dtype=np.dtype(np.float64),
21122117
numeric_only=numeric_only,
21132118
needs_counts=True,
2119+
pre_processing=_preprocessing,
21142120
post_processing=_postprocessing,
21152121
ddof=ddof,
21162122
how="std",
@@ -3720,7 +3726,7 @@ def blk_func(values: ArrayLike) -> ArrayLike:
37203726
inferences = None
37213727

37223728
if needs_counts:
3723-
counts = np.zeros(self.ngroups, dtype=np.int64)
3729+
counts = np.zeros(ngroups, dtype=np.int64)
37243730
func = partial(func, counts=counts)
37253731

37263732
vals = values
@@ -3742,11 +3748,11 @@ def blk_func(values: ArrayLike) -> ArrayLike:
37423748
is_nullable = isinstance(values, BaseMaskedArray)
37433749
func = partial(func, nullable=is_nullable)
37443750

3745-
else:
3751+
elif isinstance(values, BaseMaskedArray):
37463752
result_mask = np.zeros(result.shape, dtype=np.bool_)
37473753
func = partial(func, result_mask=result_mask)
37483754

3749-
func(**kwargs) # Call func to modify indexer values in place
3755+
func(**kwargs) # Call func to modify result in place
37503756

37513757
if values.ndim == 1:
37523758
assert result.shape[1] == 1, result.shape
@@ -3755,8 +3761,8 @@ def blk_func(values: ArrayLike) -> ArrayLike:
37553761
if post_processing:
37563762
pp_kwargs: dict[str, bool | np.ndarray] = {}
37573763
pp_kwargs["nullable"] = isinstance(values, BaseMaskedArray)
3758-
if how == "std":
3759-
pp_kwargs["mask"] = result_mask
3764+
if how == "std" and pp_kwargs["nullable"]:
3765+
pp_kwargs["result_mask"] = result_mask
37603766

37613767
result = post_processing(result, inferences, **pp_kwargs)
37623768

0 commit comments

Comments
 (0)