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

In [2]: pd.show_versions() INSTALLED VERSIONS ------------------ commit : d8159471b1e6e9327274a1b98aca2b88c9b5e0b5 python : 3.12.8 python-bits : 64 OS : Darwin OS-release : 24.6.0 Version : Darwin Kernel Version 24.6.0: Mon Jul 14 11:30:40 PDT 2025; root:xnu-11417.140.69~1/RELEASE_ARM64_T6041 machine : arm64 processor : arm byteorder : little LC_ALL : None LANG : en_US.UTF-8 LOCALE : en_US.UTF-8 pandas : 3.0.0.dev0+2463.gd8159471b1 numpy : 2.4.0.dev0+git20250808.622f874 dateutil : 2.9.0.post0 pip : None Cython : None sphinx : None IPython : 9.4.0 adbc-driver-postgresql: None adbc-driver-sqlite : None bs4 : None bottleneck : None fastparquet : None fsspec : 2025.3.2 html5lib : None hypothesis : 6.136.1 gcsfs : None jinja2 : 3.1.6 lxml.etree : None matplotlib : 3.10.3 numba : None numexpr : None odfpy : None openpyxl : None psycopg2 : None pymysql : None pyarrow : 21.0.0 pyiceberg : None pyreadstat : None pytest : 8.4.1 python-calamine : None pytz : 2025.2 pyxlsb : None s3fs : 2025.7.0 scipy : None sqlalchemy : 2.0.41 tables : None tabulate : None xarray : 2025.9.0 xlrd : None xlsxwriter : None zstandard : None qtpy : None pyqt5 : None

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

Image

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.