@@ -757,6 +757,10 @@ def nanmedian(values, *, axis: AxisInt | None = None, skipna: bool = True, mask=
757
757
>>> nanops.nanmedian(s.values)
758
758
2.0
759
759
"""
760
+ # for floats without mask, the data already uses NaN as missing value
761
+ # indicator, and `mask` will be calculated from that below -> in those
762
+ # cases we never need to set NaN to the masked values
763
+ using_nan_sentinel = values .dtype .kind == "f" and mask is None
760
764
761
765
def get_median (x , _mask = None ):
762
766
if _mask is None :
@@ -774,7 +778,7 @@ def get_median(x, _mask=None):
774
778
return res
775
779
776
780
dtype = values .dtype
777
- values , mask = _get_values (values , skipna , mask = mask , fill_value = 0 )
781
+ values , mask = _get_values (values , skipna , mask = mask , fill_value = None )
778
782
if values .dtype .kind != "f" :
779
783
if values .dtype == object :
780
784
# GH#34671 avoid casting strings to numeric
@@ -786,7 +790,9 @@ def get_median(x, _mask=None):
786
790
except ValueError as err :
787
791
# e.g. "could not convert string to float: 'a'"
788
792
raise TypeError (str (err )) from err
789
- if mask is not None :
793
+ if not using_nan_sentinel and mask is not None :
794
+ if not values .flags .writeable :
795
+ values = values .copy ()
790
796
values [mask ] = np .nan
791
797
792
798
notempty = values .size
0 commit comments