@@ -3790,6 +3790,96 @@ def test_comparison_label_based(self):
3790
3790
for v in [np .nan ]:
3791
3791
self .assertRaises (TypeError , lambda : t & v )
3792
3792
3793
+ def test_operators_bitwise (self ):
3794
+ # GH 9016: support bitwise op for integer types
3795
+ index = list ('bca' )
3796
+
3797
+ s_tft = Series ([True , False , True ], index = index )
3798
+ s_fff = Series ([False , False , False ], index = index )
3799
+ s_tff = Series ([True , False , False ], index = index )
3800
+ s_empty = Series ([])
3801
+ s_0101 = Series ([0 ,1 ,0 ,1 ])
3802
+ s_0123 = Series (range (4 ))
3803
+ s_3333 = Series ([3 ] * 4 )
3804
+ s_4444 = Series ([4 ] * 4 )
3805
+
3806
+ res = s_tft & s_empty
3807
+ expected = s_fff
3808
+ assert_series_equal (res , expected )
3809
+
3810
+ res = s_tft | s_empty
3811
+ expected = s_tft
3812
+ assert_series_equal (res , expected )
3813
+
3814
+ res = s_0123 & s_3333
3815
+ expected = Series (range (4 ))
3816
+ assert_series_equal (res , expected )
3817
+
3818
+ res = s_0123 | s_4444
3819
+ expected = Series (range (4 , 8 ))
3820
+ assert_series_equal (res , expected )
3821
+
3822
+ s_a0b1c0 = Series ([1 ], list ('b' ))
3823
+
3824
+ res = s_tft & s_a0b1c0
3825
+ expected = s_tff
3826
+ assert_series_equal (res , expected )
3827
+
3828
+ res = s_tft | s_a0b1c0
3829
+ expected = s_tft
3830
+ assert_series_equal (res , expected )
3831
+
3832
+ n0 = 0
3833
+ res = s_tft & n0
3834
+ expected = s_fff
3835
+ assert_series_equal (res , expected )
3836
+
3837
+ res = s_0123 & n0
3838
+ expected = Series ([0 ] * 4 )
3839
+ assert_series_equal (res , expected )
3840
+
3841
+ n1 = 1
3842
+ res = s_tft & n1
3843
+ expected = s_tft
3844
+ assert_series_equal (res , expected )
3845
+
3846
+ res = s_0123 & n1
3847
+ expected = Series ([0 , 1 , 0 , 1 ])
3848
+ assert_series_equal (res , expected )
3849
+
3850
+ s_1111 = Series ([1 ]* 4 , dtype = 'int8' )
3851
+ res = s_0123 & s_1111
3852
+ expected = Series ([0 , 1 , 0 , 1 ], dtype = 'int64' )
3853
+ assert_series_equal (res , expected )
3854
+
3855
+ res = s_0123 .astype (np .int16 ) | s_1111 .astype (np .int32 )
3856
+ expected = Series ([1 , 1 , 3 , 3 ], dtype = 'int32' )
3857
+ assert_series_equal (res , expected )
3858
+
3859
+ self .assertRaises (TypeError , lambda : s_1111 & 'a' )
3860
+ self .assertRaises (TypeError , lambda : s_1111 & ['a' ,'b' ,'c' ,'d' ])
3861
+ self .assertRaises (TypeError , lambda : s_0123 & np .NaN )
3862
+ self .assertRaises (TypeError , lambda : s_0123 & 3.14 )
3863
+ self .assertRaises (TypeError , lambda : s_0123 & [0.1 , 4 , 3.14 , 2 ])
3864
+
3865
+ # s_0123 will be all false now because of reindexing like s_tft
3866
+ assert_series_equal (s_tft & s_0123 , Series ([False ] * 3 , list ('bca' )))
3867
+ # s_tft will be all false now because of reindexing like s_0123
3868
+ assert_series_equal (s_0123 & s_tft , Series ([False ] * 4 ))
3869
+ assert_series_equal (s_0123 & False , Series ([False ] * 4 ))
3870
+ assert_series_equal (s_0123 ^ False , Series ([False , True , True , True ]))
3871
+ assert_series_equal (s_0123 & [False ], Series ([False ] * 4 ))
3872
+ assert_series_equal (s_0123 & (False ), Series ([False ] * 4 ))
3873
+ assert_series_equal (s_0123 & Series ([False , np .NaN , False , False ]), Series ([False ] * 4 ))
3874
+
3875
+ s_ftft = Series ([False , True , False , True ])
3876
+ assert_series_equal (s_0123 & Series ([0.1 , 4 , - 3.14 , 2 ]), s_ftft )
3877
+
3878
+ s_abNd = Series (['a' ,'b' ,np .NaN ,'d' ])
3879
+ res = s_0123 & s_abNd
3880
+ expected = s_ftft
3881
+ assert_series_equal (res , expected )
3882
+
3793
3883
def test_between (self ):
3794
3884
s = Series (bdate_range ('1/1/2000' , periods = 20 ).asobject )
3795
3885
s [::2 ] = np .nan
0 commit comments