Skip to content

Commit ee92c75

Browse files
committed
Merge pull request #5810 from jreback/bool_ops
BUG: fix issue of boolean comparison on empty DataFrames (GH5808)
2 parents cc1a791 + 635dbdd commit ee92c75

File tree

3 files changed

+43
-2
lines changed

3 files changed

+43
-2
lines changed

doc/source/release.rst

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ Bug Fixes
7474
- Bug in Series replace with timestamp dict (:issue:`5797`)
7575
- read_csv/read_table now respects the `prefix` kwarg (:issue:`5732`).
7676
- Bug in selection with missing values via ``.ix`` from a duplicate indexed DataFrame failing (:issue:`5835`)
77+
- Fix issue of boolean comparison on empty DataFrames (:issue:`5808`)
7778

7879
pandas 0.13.0
7980
-------------

pandas/core/ops.py

+7-2
Original file line numberDiff line numberDiff line change
@@ -736,11 +736,16 @@ def na_op(x, y):
736736
result = np.empty(x.size, dtype=dtype)
737737
yrav = y.ravel()
738738
mask = notnull(xrav) & notnull(yrav)
739-
result[mask] = op(xrav[mask], yrav[mask])
739+
xrav = xrav[mask]
740+
yrav = yrav[mask]
741+
if np.prod(xrav.shape) and np.prod(yrav.shape):
742+
result[mask] = op(xrav, yrav)
740743
else:
741744
result = np.empty(x.size, dtype=x.dtype)
742745
mask = notnull(xrav)
743-
result[mask] = op(xrav[mask], y)
746+
xrav = xrav[mask]
747+
if np.prod(xrav.shape):
748+
result[mask] = op(xrav, y)
744749

745750
result, changed = com._maybe_upcast_putmask(result, -mask, np.nan)
746751
result = result.reshape(x.shape)

pandas/tests/test_frame.py

+35
Original file line numberDiff line numberDiff line change
@@ -4392,6 +4392,41 @@ def test_operators(self):
43924392
df = DataFrame({'a': ['a', None, 'b']})
43934393
assert_frame_equal(df + df, DataFrame({'a': ['aa', np.nan, 'bb']}))
43944394

4395+
def test_operators_boolean(self):
4396+
4397+
# GH 5808
4398+
# empty frames, non-mixed dtype
4399+
4400+
result = DataFrame(index=[1]) & DataFrame(index=[1])
4401+
assert_frame_equal(result,DataFrame(index=[1]))
4402+
4403+
result = DataFrame(index=[1]) | DataFrame(index=[1])
4404+
assert_frame_equal(result,DataFrame(index=[1]))
4405+
4406+
result = DataFrame(index=[1]) & DataFrame(index=[1,2])
4407+
assert_frame_equal(result,DataFrame(index=[1,2]))
4408+
4409+
result = DataFrame(index=[1],columns=['A']) & DataFrame(index=[1],columns=['A'])
4410+
assert_frame_equal(result,DataFrame(index=[1],columns=['A']))
4411+
4412+
result = DataFrame(True,index=[1],columns=['A']) & DataFrame(True,index=[1],columns=['A'])
4413+
assert_frame_equal(result,DataFrame(True,index=[1],columns=['A']))
4414+
4415+
result = DataFrame(True,index=[1],columns=['A']) | DataFrame(True,index=[1],columns=['A'])
4416+
assert_frame_equal(result,DataFrame(True,index=[1],columns=['A']))
4417+
4418+
# boolean ops
4419+
result = DataFrame(1,index=[1],columns=['A']) | DataFrame(True,index=[1],columns=['A'])
4420+
assert_frame_equal(result,DataFrame(1,index=[1],columns=['A']))
4421+
4422+
def f():
4423+
DataFrame(1.0,index=[1],columns=['A']) | DataFrame(True,index=[1],columns=['A'])
4424+
self.assertRaises(TypeError, f)
4425+
4426+
def f():
4427+
DataFrame('foo',index=[1],columns=['A']) | DataFrame(True,index=[1],columns=['A'])
4428+
self.assertRaises(TypeError, f)
4429+
43954430
def test_operators_none_as_na(self):
43964431
df = DataFrame({"col1": [2, 5.0, 123, None],
43974432
"col2": [1, 2, 3, 4]}, dtype=object)

0 commit comments

Comments
 (0)