diff --git a/doc/source/whatsnew/v2.0.0.rst b/doc/source/whatsnew/v2.0.0.rst index 3e376d15a5a87..dc29010efada8 100644 --- a/doc/source/whatsnew/v2.0.0.rst +++ b/doc/source/whatsnew/v2.0.0.rst @@ -126,7 +126,7 @@ Other API changes - Passing data with dtype of "timedelta64[s]", "timedelta64[ms]", or "timedelta64[us]" to :class:`TimedeltaIndex`, :class:`Series`, or :class:`DataFrame` constructors will now retain that dtype instead of casting to "timedelta64[ns]"; timedelta64 data with lower resolution will be cast to the lowest supported resolution "timedelta64[s]" (:issue:`49014`) - Passing ``dtype`` of "timedelta64[s]", "timedelta64[ms]", or "timedelta64[us]" to :class:`TimedeltaIndex`, :class:`Series`, or :class:`DataFrame` constructors will now retain that dtype instead of casting to "timedelta64[ns]"; passing a dtype with lower resolution for :class:`Series` or :class:`DataFrame` will be cast to the lowest supported resolution "timedelta64[s]" (:issue:`49014`) - Passing a ``np.datetime64`` object with non-nanosecond resolution to :class:`Timestamp` will retain the input resolution if it is "s", "ms", or "ns"; otherwise it will be cast to the closest supported resolution (:issue:`49008`) -- +- The ``other`` argument in :meth:`DataFrame.mask` and :meth:`Series.mask` now defaults to ``no_default`` instead of ``np.nan`` consistent with :meth:`DataFrame.where` and :meth:`Series.where`. Entries will be filled with the corresponding NULL value (``np.nan`` for numpy dtypes, ``pd.NA`` for extension dtypes). (:issue:`49111`) .. --------------------------------------------------------------------------- .. _whatsnew_200.deprecations: diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 40b63c0984dde..6f0f92ac03b3f 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -11998,7 +11998,7 @@ def mask( def mask( # type: ignore[override] self, cond, - other=np.nan, + other=lib.no_default, inplace: bool = False, axis: Axis | None = None, level: Level = None, diff --git a/pandas/core/generic.py b/pandas/core/generic.py index 0dccaad1441e4..388c9223074a0 100644 --- a/pandas/core/generic.py +++ b/pandas/core/generic.py @@ -9871,6 +9871,9 @@ def where( If other is callable, it is computed on the {klass} and should return scalar or {klass}. The callable must not change input {klass} (though pandas doesn't check it). + If not specified, entries will be filled with the corresponding + NULL value (``np.nan`` for numpy dtypes, ``pd.NA`` for extension + dtypes). inplace : bool, default False Whether to perform the operation in place on the data. axis : int, default None @@ -10072,7 +10075,7 @@ def mask( def mask( self: NDFrameT, cond, - other=np.nan, + other=lib.no_default, inplace: bool_t = False, axis: Axis | None = None, level: Level = None, diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index f1c69ba705580..83c1ca0084724 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -1513,6 +1513,8 @@ def putmask(self, mask, new) -> list[Block]: See Block.putmask.__doc__ """ mask = extract_bool_array(mask) + if new is lib.no_default: + new = self.fill_value values = self.values if values.ndim == 2: diff --git a/pandas/core/series.py b/pandas/core/series.py index f4b59266e2b91..558d879127410 100644 --- a/pandas/core/series.py +++ b/pandas/core/series.py @@ -6205,7 +6205,7 @@ def mask( def mask( # type: ignore[override] self, cond, - other=np.nan, + other=lib.no_default, inplace: bool = False, axis: Axis | None = None, level: Level = None, diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index 4c05fd31f53e3..d1f695bc06224 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -856,17 +856,6 @@ def test_searchsorted(self, data_for_sorting, as_series, request): ) super().test_searchsorted(data_for_sorting, as_series) - def test_where_series(self, data, na_value, as_frame, request): - pa_dtype = data.dtype.pyarrow_dtype - if pa.types.is_temporal(pa_dtype): - request.node.add_marker( - pytest.mark.xfail( - raises=pa.ArrowNotImplementedError, - reason=f"Unsupported cast from double to {pa_dtype}", - ) - ) - super().test_where_series(data, na_value, as_frame) - def test_basic_equals(self, data): # https://github.com/pandas-dev/pandas/issues/34660 assert pd.Series(data).equals(pd.Series(data))