diff --git a/pandas/core/ops/__init__.py b/pandas/core/ops/__init__.py index 856a1823353d5..7937821814ab2 100644 --- a/pandas/core/ops/__init__.py +++ b/pandas/core/ops/__init__.py @@ -467,7 +467,7 @@ def _combine_series_frame(left, right, func, axis: int): # We assume that self.align(other, ...) has already been called rvalues = right._values - if isinstance(rvalues, np.ndarray): + if not left._mgr.any_extension_types and isinstance(rvalues, np.ndarray): # TODO(EA2D): no need to special-case with 2D EAs # We can operate block-wise if axis == 0: diff --git a/pandas/tests/arithmetic/test_numeric.py b/pandas/tests/arithmetic/test_numeric.py index a37339c66bf6e..3bf64a46600ad 100644 --- a/pandas/tests/arithmetic/test_numeric.py +++ b/pandas/tests/arithmetic/test_numeric.py @@ -1309,3 +1309,18 @@ def test_dataframe_div_silenced(): ) with tm.assert_produces_warning(None): pdf1.div(pdf2, fill_value=0) + + +def test_dataframe_series_extension_dtypes(): + # https://github.com/pandas-dev/pandas/issues/34311 + df = pd.DataFrame(np.random.randint(0, 100, (10, 3)), columns=["a", "b", "c"]) + s = pd.Series([1, 2, 3], index=["a", "b", "c"]) + + expected = df.to_numpy("int64") + s.to_numpy("int64").reshape(-1, 3) + expected = pd.DataFrame(expected, columns=df.columns, dtype="Int64") + + df_ea = df.astype("Int64") + result = df_ea + s + tm.assert_frame_equal(result, expected) + result = df_ea + s.astype("Int64") + tm.assert_frame_equal(result, expected) diff --git a/pandas/tests/frame/test_arithmetic.py b/pandas/tests/frame/test_arithmetic.py index 5cb27c697a64d..44869b6ace2d5 100644 --- a/pandas/tests/frame/test_arithmetic.py +++ b/pandas/tests/frame/test_arithmetic.py @@ -339,6 +339,20 @@ def test_df_flex_cmp_constant_return_types_empty(self, opname): result = getattr(empty, opname)(const).dtypes.value_counts() tm.assert_series_equal(result, pd.Series([2], index=[np.dtype(bool)])) + def test_df_flex_cmp_ea_dtype_with_ndarray_series(self): + ii = pd.IntervalIndex.from_breaks([1, 2, 3]) + df = pd.DataFrame({"A": ii, "B": ii}) + + ser = pd.Series([0, 0]) + res = df.eq(ser, axis=0) + + expected = pd.DataFrame({"A": [False, False], "B": [False, False]}) + tm.assert_frame_equal(res, expected) + + ser2 = pd.Series([1, 2], index=["A", "B"]) + res2 = df.eq(ser2, axis=1) + tm.assert_frame_equal(res2, expected) + # ------------------------------------------------------------------- # Arithmetic