From bc79ff33a1aca9c76d8a15d5fa30a71aa80ce0ad Mon Sep 17 00:00:00 2001 From: Brock Date: Thu, 9 Oct 2025 08:02:44 -0700 Subject: [PATCH 1/3] BUG: _cast_pointwise_result([decimal_na]) --- pandas/core/arrays/arrow/array.py | 4 ++++ pandas/tests/extension/test_arrow.py | 12 ++++++++++++ 2 files changed, 16 insertions(+) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index d4f0e4681405b..8878a20bb5b42 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -439,6 +439,10 @@ def _cast_pointwise_result(self, values) -> ArrayLike: # or test_agg_lambda_complex128_dtype_conversion for complex values return super()._cast_pointwise_result(values) + if pa.types.is_null(arr.type): + if lib.infer_dtype(values) == "decimal": + # GH#62522; the specific decimal precision here is arbitrary + arr = arr.cast(pa.decimal32(1)) if pa.types.is_duration(arr.type): # workaround for https://github.com/apache/arrow/issues/40620 result = ArrowExtensionArray._from_sequence(values) diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index c810f098f15cf..f39f7acdc57bf 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -3700,3 +3700,15 @@ def test_pow_with_all_na_float(): result = s.pow(2) expected = pd.Series([pd.NA, pd.NA], dtype="float64[pyarrow]") tm.assert_series_equal(result, expected) + + +def test_cast_pontwise_result_decimal_nan(): + # GH#62522 we don't want to get back null[pyarrow] here + ser = pd.Series([], dtype="float64[pyarrow]") + arr = ser.array + item = Decimal("NaN") + + result = arr._cast_pointwise_result([item]) + + pa_type = result.dtype.pyarrow_dtype + assert pa.types.is_decimal(pa_type) From 84caa8c30698ae465cc85eb6559e7ac9dec05ca5 Mon Sep 17 00:00:00 2001 From: Brock Date: Thu, 16 Oct 2025 08:34:19 -0700 Subject: [PATCH 2/3] xfail on older pyarrow --- pandas/tests/extension/test_arrow.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index f39f7acdc57bf..f8a7c8cd6e391 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -3702,6 +3702,7 @@ def test_pow_with_all_na_float(): tm.assert_series_equal(result, expected) +@pytest.mark.xfail(pa_version_under14p0, reason="decimal32 not implemented") def test_cast_pontwise_result_decimal_nan(): # GH#62522 we don't want to get back null[pyarrow] here ser = pd.Series([], dtype="float64[pyarrow]") From 59b9e12fb7f4634005974f77095f4fe093ace388 Mon Sep 17 00:00:00 2001 From: Brock Date: Thu, 16 Oct 2025 09:54:31 -0700 Subject: [PATCH 3/3] decimal32->decimal128 --- pandas/core/arrays/arrow/array.py | 2 +- pandas/tests/extension/test_arrow.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pandas/core/arrays/arrow/array.py b/pandas/core/arrays/arrow/array.py index 8878a20bb5b42..63052c4f4fea9 100644 --- a/pandas/core/arrays/arrow/array.py +++ b/pandas/core/arrays/arrow/array.py @@ -442,7 +442,7 @@ def _cast_pointwise_result(self, values) -> ArrayLike: if pa.types.is_null(arr.type): if lib.infer_dtype(values) == "decimal": # GH#62522; the specific decimal precision here is arbitrary - arr = arr.cast(pa.decimal32(1)) + arr = arr.cast(pa.decimal128(1)) if pa.types.is_duration(arr.type): # workaround for https://github.com/apache/arrow/issues/40620 result = ArrowExtensionArray._from_sequence(values) diff --git a/pandas/tests/extension/test_arrow.py b/pandas/tests/extension/test_arrow.py index f8a7c8cd6e391..f39f7acdc57bf 100644 --- a/pandas/tests/extension/test_arrow.py +++ b/pandas/tests/extension/test_arrow.py @@ -3702,7 +3702,6 @@ def test_pow_with_all_na_float(): tm.assert_series_equal(result, expected) -@pytest.mark.xfail(pa_version_under14p0, reason="decimal32 not implemented") def test_cast_pontwise_result_decimal_nan(): # GH#62522 we don't want to get back null[pyarrow] here ser = pd.Series([], dtype="float64[pyarrow]")