From 635dbddef159566dacb0dfff86a968ab74579c51 Mon Sep 17 00:00:00 2001 From: jreback Date: Tue, 31 Dec 2013 10:42:22 -0500 Subject: [PATCH] BUG: fix issue of boolean comparison on empty DataFrames (GH5808) --- doc/source/release.rst | 1 + pandas/core/ops.py | 9 +++++++-- pandas/tests/test_frame.py | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/doc/source/release.rst b/doc/source/release.rst index 0150b233110a7..425f6dfe36990 100644 --- a/doc/source/release.rst +++ b/doc/source/release.rst @@ -74,6 +74,7 @@ Bug Fixes - Bug in Series replace with timestamp dict (:issue:`5797`) - read_csv/read_table now respects the `prefix` kwarg (:issue:`5732`). - Bug in selection with missing values via ``.ix`` from a duplicate indexed DataFrame failing (:issue:`5835`) + - Fix issue of boolean comparison on empty DataFrames (:issue:`5808`) pandas 0.13.0 ------------- diff --git a/pandas/core/ops.py b/pandas/core/ops.py index b8f988e38f14b..a0e274b952817 100644 --- a/pandas/core/ops.py +++ b/pandas/core/ops.py @@ -736,11 +736,16 @@ def na_op(x, y): result = np.empty(x.size, dtype=dtype) yrav = y.ravel() mask = notnull(xrav) & notnull(yrav) - result[mask] = op(xrav[mask], yrav[mask]) + xrav = xrav[mask] + yrav = yrav[mask] + if np.prod(xrav.shape) and np.prod(yrav.shape): + result[mask] = op(xrav, yrav) else: result = np.empty(x.size, dtype=x.dtype) mask = notnull(xrav) - result[mask] = op(xrav[mask], y) + xrav = xrav[mask] + if np.prod(xrav.shape): + result[mask] = op(xrav, y) result, changed = com._maybe_upcast_putmask(result, -mask, np.nan) result = result.reshape(x.shape) diff --git a/pandas/tests/test_frame.py b/pandas/tests/test_frame.py index a1ef94d8400da..ef6990337bbbb 100644 --- a/pandas/tests/test_frame.py +++ b/pandas/tests/test_frame.py @@ -4392,6 +4392,41 @@ def test_operators(self): df = DataFrame({'a': ['a', None, 'b']}) assert_frame_equal(df + df, DataFrame({'a': ['aa', np.nan, 'bb']})) + def test_operators_boolean(self): + + # GH 5808 + # empty frames, non-mixed dtype + + result = DataFrame(index=[1]) & DataFrame(index=[1]) + assert_frame_equal(result,DataFrame(index=[1])) + + result = DataFrame(index=[1]) | DataFrame(index=[1]) + assert_frame_equal(result,DataFrame(index=[1])) + + result = DataFrame(index=[1]) & DataFrame(index=[1,2]) + assert_frame_equal(result,DataFrame(index=[1,2])) + + result = DataFrame(index=[1],columns=['A']) & DataFrame(index=[1],columns=['A']) + assert_frame_equal(result,DataFrame(index=[1],columns=['A'])) + + result = DataFrame(True,index=[1],columns=['A']) & DataFrame(True,index=[1],columns=['A']) + assert_frame_equal(result,DataFrame(True,index=[1],columns=['A'])) + + result = DataFrame(True,index=[1],columns=['A']) | DataFrame(True,index=[1],columns=['A']) + assert_frame_equal(result,DataFrame(True,index=[1],columns=['A'])) + + # boolean ops + result = DataFrame(1,index=[1],columns=['A']) | DataFrame(True,index=[1],columns=['A']) + assert_frame_equal(result,DataFrame(1,index=[1],columns=['A'])) + + def f(): + DataFrame(1.0,index=[1],columns=['A']) | DataFrame(True,index=[1],columns=['A']) + self.assertRaises(TypeError, f) + + def f(): + DataFrame('foo',index=[1],columns=['A']) | DataFrame(True,index=[1],columns=['A']) + self.assertRaises(TypeError, f) + def test_operators_none_as_na(self): df = DataFrame({"col1": [2, 5.0, 123, None], "col2": [1, 2, 3, 4]}, dtype=object)