From b24df5875af0805de39bb01b5fe998776a43f1b3 Mon Sep 17 00:00:00 2001 From: allecole Date: Fri, 8 Aug 2025 14:45:16 -0700 Subject: [PATCH 1/3] BUG: Bug fix for implicit upcast to float64 for large series --- pandas/core/ops/array_ops.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/ops/array_ops.py b/pandas/core/ops/array_ops.py index 3a466b6fc7fc8..d1e211cd991be 100644 --- a/pandas/core/ops/array_ops.py +++ b/pandas/core/ops/array_ops.py @@ -573,7 +573,7 @@ def maybe_prepare_scalar_for_op(obj, shape: Shape): return int(obj) elif isinstance(obj, np.floating): - return float(obj) + return np.dtype(obj.dtype).type(obj) return obj From e115956c733e21b1ceccfad7f51ffbe605aa754d Mon Sep 17 00:00:00 2001 From: allecole Date: Fri, 8 Aug 2025 15:39:59 -0700 Subject: [PATCH 2/3] Added test for float32 upcast in array_ops --- doc/source/whatsnew/v3.0.0.rst | 1 + pandas/tests/series/methods/test_convert_dtypes.py | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/doc/source/whatsnew/v3.0.0.rst b/doc/source/whatsnew/v3.0.0.rst index 834477f2aa46a..2d7d848146d62 100644 --- a/doc/source/whatsnew/v3.0.0.rst +++ b/doc/source/whatsnew/v3.0.0.rst @@ -752,6 +752,7 @@ Conversion - Bug in :meth:`Series.astype` might modify read-only array inplace when casting to a string dtype (:issue:`57212`) - Bug in :meth:`Series.convert_dtypes` and :meth:`DataFrame.convert_dtypes` removing timezone information for objects with :class:`ArrowDtype` (:issue:`60237`) - Bug in :meth:`Series.reindex` not maintaining ``float32`` type when a ``reindex`` introduces a missing value (:issue:`45857`) +- Bug in :meth:`_array_ops._maybe_prepare_scalar_for_op` not maintaining ``float32`` type when converting NumPy floating scalars (:issue:`61951`) Strings ^^^^^^^ diff --git a/pandas/tests/series/methods/test_convert_dtypes.py b/pandas/tests/series/methods/test_convert_dtypes.py index 324e03894e92c..656c3f21d10e6 100644 --- a/pandas/tests/series/methods/test_convert_dtypes.py +++ b/pandas/tests/series/methods/test_convert_dtypes.py @@ -318,3 +318,9 @@ def test_convert_dtype_pyarrow_timezone_preserve(self): result = ser.convert_dtypes(dtype_backend="pyarrow") expected = ser.copy() tm.assert_series_equal(result, expected) + + def test_float32_series_addition_preserves_dtype(self): + # GH#61951 + ser_a = pd.Series(np.zeros(1000000), dtype="float32") + np.float32(1) + ser_b = pd.Series(np.zeros(1000001), dtype="float32") + np.float32(1) + assert all(dtype == np.float32 for dtype in (ser_a.dtype, ser_b.dtype)) From 8c76040739fa7858310e1912fa16d5028c7c3ef6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 8 Aug 2025 23:06:51 +0000 Subject: [PATCH 3/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- pandas/tests/series/methods/test_convert_dtypes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/tests/series/methods/test_convert_dtypes.py b/pandas/tests/series/methods/test_convert_dtypes.py index 656c3f21d10e6..b89255a0ae8ee 100644 --- a/pandas/tests/series/methods/test_convert_dtypes.py +++ b/pandas/tests/series/methods/test_convert_dtypes.py @@ -318,7 +318,7 @@ def test_convert_dtype_pyarrow_timezone_preserve(self): result = ser.convert_dtypes(dtype_backend="pyarrow") expected = ser.copy() tm.assert_series_equal(result, expected) - + def test_float32_series_addition_preserves_dtype(self): # GH#61951 ser_a = pd.Series(np.zeros(1000000), dtype="float32") + np.float32(1)