From edba48974460af52fbc96943a9d1d306e7b72018 Mon Sep 17 00:00:00 2001 From: jreback Date: Thu, 13 Feb 2014 18:00:08 -0500 Subject: [PATCH] BUG: Bug in setting complex dtypes via boolean indexing (GH6345) --- doc/source/release.rst | 1 + pandas/core/internals.py | 6 +++++- pandas/tests/test_frame.py | 7 +++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/doc/source/release.rst b/doc/source/release.rst index 829a21f8033ca..78678a0ee81a6 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -96,6 +96,7 @@ Bug Fixes - Bug in ``DataFrame.replace()`` when passing a non- ``bool`` ``to_replace`` argument (:issue:`6332`) - Raise when trying to align on different levels of a multi-index assignment (:issue:`3738`) +- Bug in setting complex dtypes via boolean indexing (:issue:`6345`) pandas 0.13.1 ------------- diff --git a/pandas/core/internals.py b/pandas/core/internals.py index faf8587460825..2fd579e5d2059 100644 --- a/pandas/core/internals.py +++ b/pandas/core/internals.py @@ -1221,7 +1221,11 @@ class ComplexBlock(FloatOrComplexBlock): is_complex = True def _can_hold_element(self, element): - return isinstance(element, complex) + if is_list_like(element): + element = np.array(element) + return issubclass(element.dtype.type, (np.floating, np.integer, np.complexfloating)) + return (isinstance(element, (float, int, complex, np.float_, np.int_)) and + not isinstance(bool, np.bool_)) def _try_cast(self, element): try: diff --git a/pandas/tests/test_frame.py b/pandas/tests/test_frame.py index e73f1e792e826..da60326fc232f 100644 --- a/pandas/tests/test_frame.py +++ b/pandas/tests/test_frame.py @@ -8736,6 +8736,13 @@ def create(): result = df.where(pd.notnull(df),DataFrame(1,index=df.index,columns=df.columns)) assert_frame_equal(result, expected) + def test_where_complex(self): + # GH 6345 + expected = DataFrame([[1+1j, 2], [np.nan, 4+1j]], columns=['a', 'b']) + df = DataFrame([[1+1j, 2], [5+1j, 4+1j]], columns=['a', 'b']) + df[df.abs() >= 5] = np.nan + assert_frame_equal(df,expected) + def test_mask(self): df = DataFrame(np.random.randn(5, 3)) cond = df > 0