Skip to content

Commit f9cb022

Browse files
committed
BUG: Return NotImplemented for non-1D operands in BooleanArray ops; add tests for numeric EA shape errors
1 parent ccb1706 commit f9cb022

File tree

2 files changed

+32
-1
lines changed

2 files changed

+32
-1
lines changed

pandas/core/arrays/boolean.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,7 @@ def _logical_method(self, other, op): # type: ignore[override]
379379
elif is_list_like(other):
380380
other = np.asarray(other, dtype="bool")
381381
if other.ndim > 1:
382-
raise NotImplementedError("can only perform ops with 1-d structures")
382+
return NotImplemented
383383
other, mask = coerce_to_array(other, copy=False)
384384
elif isinstance(other, np.bool_):
385385
other = other.item()

pandas/tests/arithmetic/test_numeric.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,8 @@ def test_df_div_zero_series_does_not_commute(self):
564564
res2 = df / ser
565565
assert not res.fillna(0).equals(res2.fillna(0))
566566

567+
568+
567569
# ------------------------------------------------------------------
568570
# Mod By Zero
569571

@@ -855,6 +857,35 @@ def test_modulo_zero_int(self):
855857
result = 0 % s
856858
expected = Series([np.nan, 0.0])
857859
tm.assert_series_equal(result, expected)
860+
861+
def test_np_array_mul_ea_array_returns_extensionarray():
862+
np_array = np.array([1, 2, 3, 4, 5], dtype=tm.SIGNED_INT_NUMPY_DTYPES[0])
863+
ea_array = pd.array([1, 2, 3, 4, 5], dtype=tm.SIGNED_INT_EA_DTYPES[0])
864+
result = np_array * ea_array
865+
tm.assert_isinstance(result, type(ea_array))
866+
tm.assert_equal(result, pd.array([1, 4, 9, 16, 25], dtype=tm.SIGNED_INT_EA_DTYPES[0]))
867+
tm.assert_equal(result, pd.array([1, 4, 9, 16, 25], dtype=tm.SIGNED_INT_EA_DTYPES[0]))
868+
869+
def test_df_mul_np_and_ea_array_shape_and_errors():
870+
df = pd.DataFrame(np.arange(50).reshape(10, 5)).notna().values
871+
NP_array = pd.array([i for i in range(10)], dtype=tm.SIGNED_INT_NUMPY_DTYPES[0]).reshape(10, 1)
872+
EA_array = pd.array([i for i in range(10)], dtype=tm.SIGNED_INT_EA_DTYPES[0]).reshape(10, 1)
873+
874+
result_np = df * NP_array
875+
tm.assert_isinstance(result_np, np.ndarray)
876+
tm.assert_equal(result_np.shape, (10, 5))
877+
878+
with tm.assert_raises(TypeError):
879+
_ = df * EA_array
880+
881+
def test_non_1d_ea_raises_typeerror():
882+
ea_array = pd.array([1, 2, 3, 4, 5], dtype=tm.SIGNED_INT_EA_DTYPES[0]).reshape(5, 1)
883+
np_array = np.array([1, 2, 3, 4, 5], dtype=tm.SIGNED_INT_NUMPY_DTYPES[0]).reshape(5, 1)
884+
885+
with tm.assert_raises(TypeError):
886+
_ = ea_array * np_array
887+
with tm.assert_raises(TypeError):
888+
_ = np_array * ea_array
858889

859890

860891
class TestAdditionSubtraction:

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy