Skip to content

BUG: Regression in Series.pow with all-NA double[pyarrow] values in pandas 3.x #62520

@TomAugspurger

Description

@TomAugspurger

Pandas version checks

  • I have checked that this issue has not already been reported.

  • I have confirmed this bug exists on the latest version of pandas.

  • 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 : d815947
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

Metadata

Metadata

Assignees

Labels

Arrowpyarrow functionalityBugNumeric OperationsArithmetic, Comparison, and Logical operationsRegressionFunctionality that used to work in a prior pandas versiongood first issue

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions