From bd84cd5ddaf9d74b58824b73de6a104e8ec7f4c0 Mon Sep 17 00:00:00 2001 From: ganevgv Date: Sun, 10 Nov 2019 15:56:41 +0000 Subject: [PATCH 1/3] add Series/DF logical operations nan propagation tests --- pandas/tests/frame/test_operators.py | 14 ++++++++++++++ pandas/tests/series/test_operators.py | 14 ++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/pandas/tests/frame/test_operators.py b/pandas/tests/frame/test_operators.py index 19d91241d6a6b..8dd3b95f60c7c 100644 --- a/pandas/tests/frame/test_operators.py +++ b/pandas/tests/frame/test_operators.py @@ -218,6 +218,20 @@ def test_logical_with_nas(self): expected = Series([True, True]) tm.assert_series_equal(result, expected) + @pytest.mark.parametrize( + "A, B, C", + [ + ([True, False, np.nan], [True, False, True], [True, False, False]), + ([True, False, True], [True, False, np.nan], [True, False, True]), + ], + ) + def test_logical_operators_nans(self, A, B, C): + # GH 13896 + result = DataFrame(A) | DataFrame(B) + expected = DataFrame(C) + + tm.assert_frame_equal(result, expected) + class TestDataFrameOperators: @pytest.mark.parametrize( diff --git a/pandas/tests/series/test_operators.py b/pandas/tests/series/test_operators.py index 7d212ee7cd667..15c809c371801 100644 --- a/pandas/tests/series/test_operators.py +++ b/pandas/tests/series/test_operators.py @@ -43,6 +43,20 @@ def test_logical_operators_bool_dtype_with_empty(self): expected = s_tft tm.assert_series_equal(res, expected) + @pytest.mark.parametrize( + "A, B, C", + [ + ([True, False, np.nan], [True, False, True], [True, False, False]), + ([True, False, True], [True, False, np.nan], [True, False, True]), + ], + ) + def test_logical_operators_nans(self, A, B, C): + # GH 13896 + result = Series(A) | Series(B) + expected = Series(C) + + tm.assert_series_equal(result, expected) + def test_logical_operators_int_dtype_with_int_dtype(self): # GH#9016: support bitwise op for integer types From ad6350a6c7c37d09dc5fe57c291b0d208a4248c8 Mon Sep 17 00:00:00 2001 From: ganevgv Date: Sun, 10 Nov 2019 18:44:11 +0000 Subject: [PATCH 2/3] change A, B, C to left, right, expected --- pandas/tests/frame/test_operators.py | 8 ++++---- pandas/tests/series/test_operators.py | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/pandas/tests/frame/test_operators.py b/pandas/tests/frame/test_operators.py index 8dd3b95f60c7c..4bb54010039b2 100644 --- a/pandas/tests/frame/test_operators.py +++ b/pandas/tests/frame/test_operators.py @@ -219,16 +219,16 @@ def test_logical_with_nas(self): tm.assert_series_equal(result, expected) @pytest.mark.parametrize( - "A, B, C", + "left, right, expected", [ ([True, False, np.nan], [True, False, True], [True, False, False]), ([True, False, True], [True, False, np.nan], [True, False, True]), ], ) - def test_logical_operators_nans(self, A, B, C): + def test_logical_operators_nans(self, left, right, expected): # GH 13896 - result = DataFrame(A) | DataFrame(B) - expected = DataFrame(C) + result = DataFrame(left) | DataFrame(right) + expected = DataFrame(expected) tm.assert_frame_equal(result, expected) diff --git a/pandas/tests/series/test_operators.py b/pandas/tests/series/test_operators.py index 15c809c371801..183ef7cb3c451 100644 --- a/pandas/tests/series/test_operators.py +++ b/pandas/tests/series/test_operators.py @@ -44,16 +44,16 @@ def test_logical_operators_bool_dtype_with_empty(self): tm.assert_series_equal(res, expected) @pytest.mark.parametrize( - "A, B, C", + "left, right, expected", [ ([True, False, np.nan], [True, False, True], [True, False, False]), ([True, False, True], [True, False, np.nan], [True, False, True]), ], ) - def test_logical_operators_nans(self, A, B, C): + def test_logical_operators_nans(self, left, right, expected): # GH 13896 - result = Series(A) | Series(B) - expected = Series(C) + result = Series(left) | Series(right) + expected = Series(expected) tm.assert_series_equal(result, expected) From d7d5dcef717b9f7a7c89e4f46116b67d2deae741 Mon Sep 17 00:00:00 2001 From: ganevgv Date: Mon, 11 Nov 2019 22:13:05 +0000 Subject: [PATCH 3/3] add tests for and --- pandas/tests/frame/test_operators.py | 32 ++++++++++++++++++++++----- pandas/tests/series/test_operators.py | 32 ++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/pandas/tests/frame/test_operators.py b/pandas/tests/frame/test_operators.py index 4bb54010039b2..39f738657ddd5 100644 --- a/pandas/tests/frame/test_operators.py +++ b/pandas/tests/frame/test_operators.py @@ -219,15 +219,37 @@ def test_logical_with_nas(self): tm.assert_series_equal(result, expected) @pytest.mark.parametrize( - "left, right, expected", + "left, right, op, expected", [ - ([True, False, np.nan], [True, False, True], [True, False, False]), - ([True, False, True], [True, False, np.nan], [True, False, True]), + ( + [True, False, np.nan], + [True, False, True], + operator.and_, + [True, False, False], + ), + ( + [True, False, True], + [True, False, np.nan], + operator.and_, + [True, False, False], + ), + ( + [True, False, np.nan], + [True, False, True], + operator.or_, + [True, False, False], + ), + ( + [True, False, True], + [True, False, np.nan], + operator.or_, + [True, False, True], + ), ], ) - def test_logical_operators_nans(self, left, right, expected): + def test_logical_operators_nans(self, left, right, op, expected): # GH 13896 - result = DataFrame(left) | DataFrame(right) + result = op(DataFrame(left), DataFrame(right)) expected = DataFrame(expected) tm.assert_frame_equal(result, expected) diff --git a/pandas/tests/series/test_operators.py b/pandas/tests/series/test_operators.py index 183ef7cb3c451..983560d68c28c 100644 --- a/pandas/tests/series/test_operators.py +++ b/pandas/tests/series/test_operators.py @@ -44,15 +44,37 @@ def test_logical_operators_bool_dtype_with_empty(self): tm.assert_series_equal(res, expected) @pytest.mark.parametrize( - "left, right, expected", + "left, right, op, expected", [ - ([True, False, np.nan], [True, False, True], [True, False, False]), - ([True, False, True], [True, False, np.nan], [True, False, True]), + ( + [True, False, np.nan], + [True, False, True], + operator.and_, + [True, False, False], + ), + ( + [True, False, True], + [True, False, np.nan], + operator.and_, + [True, False, False], + ), + ( + [True, False, np.nan], + [True, False, True], + operator.or_, + [True, False, False], + ), + ( + [True, False, True], + [True, False, np.nan], + operator.or_, + [True, False, True], + ), ], ) - def test_logical_operators_nans(self, left, right, expected): + def test_logical_operators_nans(self, left, right, op, expected): # GH 13896 - result = Series(left) | Series(right) + result = op(Series(left), Series(right)) expected = Series(expected) tm.assert_series_equal(result, expected)