Skip to content

Commit ca41a75

Browse files
authored
ENH: Get rid of float cast in masked reduction ops (#50833)
1 parent 5e4ea2e commit ca41a75

File tree

2 files changed

+12
-10
lines changed

2 files changed

+12
-10
lines changed

pandas/core/arrays/masked.py

+1-6
Original file line numberDiff line numberDiff line change
@@ -1081,12 +1081,7 @@ def _reduce(self, name: str, *, skipna: bool = True, **kwargs):
10811081
data = self._data
10821082
mask = self._mask
10831083

1084-
# coerce to a nan-aware float if needed
1085-
# (we explicitly use NaN within reductions)
1086-
if self._hasna:
1087-
data = self.to_numpy("float64", na_value=np.nan)
1088-
1089-
# median, skew, kurt, idxmin, idxmax
1084+
# median, skew, kurt, sem
10901085
op = getattr(nanops, f"nan{name}")
10911086
result = op(data, axis=0, skipna=skipna, mask=mask, **kwargs)
10921087

pandas/core/nanops.py

+11-4
Original file line numberDiff line numberDiff line change
@@ -761,15 +761,15 @@ def get_median(x, _mask=None):
761761
res = np.nanmedian(x[_mask])
762762
return res
763763

764-
values, mask, dtype, _, _ = _get_values(values, skipna, mask=mask)
764+
values, mask, dtype, _, _ = _get_values(values, skipna, mask=mask, fill_value=0)
765765
if not is_float_dtype(values.dtype):
766766
try:
767767
values = values.astype("f8")
768768
except ValueError as err:
769769
# e.g. "could not convert string to float: 'a'"
770770
raise TypeError(str(err)) from err
771-
if mask is not None:
772-
values[mask] = np.nan
771+
if mask is not None:
772+
values[mask] = np.nan
773773

774774
notempty = values.size
775775

@@ -1043,8 +1043,11 @@ def nansem(
10431043
if not is_float_dtype(values.dtype):
10441044
values = values.astype("f8")
10451045

1046+
if not skipna and mask is not None and mask.any():
1047+
return np.nan
1048+
10461049
count, _ = _get_counts_nanvar(values.shape, mask, axis, ddof, values.dtype)
1047-
var = nanvar(values, axis=axis, skipna=skipna, ddof=ddof)
1050+
var = nanvar(values, axis=axis, skipna=skipna, ddof=ddof, mask=mask)
10481051

10491052
return np.sqrt(var) / np.sqrt(count)
10501053

@@ -1225,6 +1228,8 @@ def nanskew(
12251228
if skipna and mask is not None:
12261229
values = values.copy()
12271230
np.putmask(values, mask, 0)
1231+
elif not skipna and mask is not None and mask.any():
1232+
return np.nan
12281233

12291234
mean = values.sum(axis, dtype=np.float64) / count
12301235
if axis is not None:
@@ -1313,6 +1318,8 @@ def nankurt(
13131318
if skipna and mask is not None:
13141319
values = values.copy()
13151320
np.putmask(values, mask, 0)
1321+
elif not skipna and mask is not None and mask.any():
1322+
return np.nan
13161323

13171324
mean = values.sum(axis, dtype=np.float64) / count
13181325
if axis is not None:

0 commit comments

Comments
 (0)