diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index 6ba07b1761557..e16d3ce3d62b0 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -1918,7 +1918,13 @@ def np_can_hold_element(dtype: np.dtype, element: Any) -> Any: # i.e. there are pd.NA elements raise LossySetitemError return element + # GH 57338 + # Check boolean array set as object type + if tipo.kind == "O" and isinstance(element, np.ndarray): + if all(lib.is_bool(e) for e in element): + return element.astype("bool") raise LossySetitemError + if lib.is_bool(element): return element raise LossySetitemError diff --git a/pandas/tests/dtypes/cast/test_can_hold_element.py b/pandas/tests/dtypes/cast/test_can_hold_element.py index 3b7d76ead119a..fc56c395f1e0f 100644 --- a/pandas/tests/dtypes/cast/test_can_hold_element.py +++ b/pandas/tests/dtypes/cast/test_can_hold_element.py @@ -77,3 +77,17 @@ def test_can_hold_element_int8_int(): assert not can_hold_element(arr, np.uint32(element)) assert not can_hold_element(arr, np.int64(element)) assert not can_hold_element(arr, np.uint64(element)) + + +def test_can_hold_element_bool(): + arr = np.array([], dtype=bool) + + element = True + assert can_hold_element(arr, element) + assert can_hold_element(arr, np.array([element])) + assert can_hold_element(arr, np.array([element], dtype=object)) + + element = 1 + assert not can_hold_element(arr, element) + assert not can_hold_element(arr, np.array([element])) + assert not can_hold_element(arr, np.array([element], dtype=object))