Pandas version checks
-
[x] I have checked that this issue has not already been reported.
-
[x] I have confirmed this bug exists on the latest version of pandas.
-
[x] I have confirmed this bug exists on the main branch of pandas.
Reproducible Example
import pandas as pd
import pyarrow as pa
s = pd.Series([None, None], dtype=pd.ArrowDtype(pa.float64()))
s.pow(2)
Issue Description
The snippet above succeeds with pandas 2.x, but raises a ArrowNotImplementedError: Function 'replace_with_mask' has no kernel matching input types (double, null, double)
with pandas 3.x
---------------------------------------------------------------------------
ArrowNotImplementedError Traceback (most recent call last)
Cell In[1], line 6
2 import pyarrow as pa
5 s = pd.Series([None, None], dtype=pd.ArrowDtype(pa.float64()))
----> 6 s.pow(2)
File ~/gh/dask/.venv/lib/python3.12/site-packages/pandas/core/series.py:6591, in Series.pow(self, other, level, fill_value, axis)
6589 @Appender(ops.make_flex_doc("pow", "series"))
6590 def pow(self, other, level=None, fill_value=None, axis: Axis = 0) -> Series:
-> 6591 return self._flex_method(
6592 other, operator.pow, level=level, fill_value=fill_value, axis=axis
6593 )
File ~/gh/dask/.venv/lib/python3.12/site-packages/pandas/core/series.py:6050, in Series._flex_method(self, other, op, level, fill_value, axis)
6047 return op(self, fill_value)
6048 self = self.fillna(fill_value)
-> 6050 return op(self, other)
File ~/gh/dask/.venv/lib/python3.12/site-packages/pandas/core/ops/common.py:70, in _unpack_zerodim_and_defer.<locals>.new_method(self, other)
66 return NotImplemented
68 other = item_from_zerodim(other)
---> 70 return method(self, other)
File ~/gh/dask/.venv/lib/python3.12/site-packages/pandas/core/arraylike.py:245, in OpsMixin.__pow__(self, other)
243 @unpack_zerodim_and_defer("__pow__")
244 def __pow__(self, other):
--> 245 return self._arith_method(other, operator.pow)
File ~/gh/dask/.venv/lib/python3.12/site-packages/pandas/core/series.py:5924, in Series._arith_method(self, other, op)
5922 def _arith_method(self, other, op):
5923 self, other = self._align_for_op(other)
-> 5924 return base.IndexOpsMixin._arith_method(self, other, op)
File ~/gh/dask/.venv/lib/python3.12/site-packages/pandas/core/base.py:1485, in IndexOpsMixin._arith_method(self, other, op)
1482 rvalues = np.arange(rvalues.start, rvalues.stop, rvalues.step)
1484 with np.errstate(all="ignore"):
-> 1485 result = ops.arithmetic_op(lvalues, rvalues, op)
1487 return self._construct_result(result, name=res_name, other=other)
File ~/gh/dask/.venv/lib/python3.12/site-packages/pandas/core/ops/array_ops.py:272, in arithmetic_op(left, right, op)
259 # NB: We assume that extract_array and ensure_wrapped_if_datetimelike
260 # have already been called on `left` and `right`,
261 # and `maybe_prepare_scalar_for_op` has already been called on `right`
262 # We need to special-case datetime64/timedelta64 dtypes (e.g. because numpy
263 # casts integer dtypes to timedelta64 when operating with timedelta64 - GH#22390)
265 if (
266 should_extension_dispatch(left, right)
267 or isinstance(right, (Timedelta, BaseOffset, Timestamp))
(...) 270 # Timedelta/Timestamp and other custom scalars are included in the check
271 # because numexpr will fail on it, see GH#31457
--> 272 res_values = op(left, right)
273 else:
274 # TODO we should handle EAs consistently and move this check before the if/else
275 # (https://github.com/pandas-dev/pandas/issues/41165)
276 # error: Argument 2 to "_bool_arith_check" has incompatible type
277 # "Union[ExtensionArray, ndarray[Any, Any]]"; expected "ndarray[Any, Any]"
278 _bool_arith_check(op, left, right) # type: ignore[arg-type]
File ~/gh/dask/.venv/lib/python3.12/site-packages/pandas/core/ops/common.py:70, in _unpack_zerodim_and_defer.<locals>.new_method(self, other)
66 return NotImplemented
68 other = item_from_zerodim(other)
---> 70 return method(self, other)
File ~/gh/dask/.venv/lib/python3.12/site-packages/pandas/core/arraylike.py:245, in OpsMixin.__pow__(self, other)
243 @unpack_zerodim_and_defer("__pow__")
244 def __pow__(self, other):
--> 245 return self._arith_method(other, operator.pow)
File ~/gh/dask/.venv/lib/python3.12/site-packages/pandas/core/arrays/arrow/array.py:1055, in ArrowExtensionArray._arith_method(self, other, op)
1053 parr = result._pa_array
1054 mask = pc.is_nan(parr).to_numpy()
-> 1055 arr = pc.replace_with_mask(parr, mask, pa.scalar(None, type=parr.type))
1056 result = type(self)(arr)
1057 return result
File ~/gh/dask/.venv/lib/python3.12/site-packages/pyarrow/compute.py:252, in _make_generic_wrapper.<locals>.wrapper(memory_pool, *args)
250 if args and isinstance(args[0], Expression):
251 return Expression._call(func_name, list(args))
--> 252 return func.call(args, None, memory_pool)
File ~/gh/dask/.venv/lib/python3.12/site-packages/pyarrow/_compute.pyx:399, in pyarrow._compute.Function.call()
File ~/gh/dask/.venv/lib/python3.12/site-packages/pyarrow/error.pxi:155, in pyarrow.lib.pyarrow_internal_check_status()
File ~/gh/dask/.venv/lib/python3.12/site-packages/pyarrow/error.pxi:92, in pyarrow.lib.check_status()
ArrowNotImplementedError: Function 'replace_with_mask' has no kernel matching input types (double, null, double)
Expected Behavior
The pandas 2.x output:
0 <NA>
1 <NA>
dtype: double[pyarrow]
Installed Versions
Comment From: rhshadrach
git bisect shows
commit e4ca40511c13cf845058066ce174d4e233840d92
Author: jbrockmendel
Date: Thu Sep 25 19:53:12 2025 -0700
API: mode.nan_is_na to consistently distinguish NaN-vs-NA (#62040)
cc @jbrockmendel
Comment From: jbrockmendel
Looks like in ArrowEA._arith_method we have a line
mask = pc.is_nan(parr).to_numpy()
that should be
mask = pc.is_nan(parr).fill_null(False).to_numpy()
Comment From: fandimeng-fm
take
Comment From: aryandhawan
The issue seems to be resolved
Comment From: rhshadrach
@aryandhawan - are you using the main branch of pandas? Can you show the output of pd.show_versions()
. Please post as text, not a screenshot.
Comment From: aryandhawan
@rhshadrach 2.2.3 is my pandas version
Comment From: TomAugspurger
Makes sense. This was a regression on main
that hasn't yet been released.