@@ -183,46 +183,47 @@ def test_comparison_tuples(self):
183
183
expected = Series ([True , False ])
184
184
assert_series_equal (result , expected )
185
185
186
- def test_comparison_operators_with_nas (self ):
186
+ @pytest .mark .parametrize ('op' , ['lt' , 'le' , 'gt' , 'ge' , 'eq' , 'ne' ])
187
+ def test_comparison_operators_with_nas (self , op ):
187
188
ser = Series (bdate_range ('1/1/2000' , periods = 10 ), dtype = object )
188
189
ser [::2 ] = np .nan
189
190
190
191
# test that comparisons work
191
- ops = ['lt' , 'le' , 'gt' , 'ge' , 'eq' , 'ne' ]
192
- for op in ops :
193
- val = ser [5 ]
192
+ val = ser [5 ]
194
193
195
- f = getattr (operator , op )
196
- result = f (ser , val )
194
+ f = getattr (operator , op )
195
+ result = f (ser , val )
197
196
198
- expected = f (ser .dropna (), val ).reindex (ser .index )
197
+ expected = f (ser .dropna (), val ).reindex (ser .index )
199
198
200
- if op == 'ne' :
201
- expected = expected .fillna (True ).astype (bool )
202
- else :
203
- expected = expected .fillna (False ).astype (bool )
199
+ if op == 'ne' :
200
+ expected = expected .fillna (True ).astype (bool )
201
+ else :
202
+ expected = expected .fillna (False ).astype (bool )
204
203
205
- assert_series_equal (result , expected )
204
+ assert_series_equal (result , expected )
206
205
207
- # fffffffuuuuuuuuuuuu
208
- # result = f(val, s)
209
- # expected = f(val, s.dropna()).reindex(s.index)
210
- # assert_series_equal(result, expected)
206
+ # fffffffuuuuuuuuuuuu
207
+ # result = f(val, s)
208
+ # expected = f(val, s.dropna()).reindex(s.index)
209
+ # assert_series_equal(result, expected)
211
210
212
- # boolean &, |, ^ should work with object arrays and propagate NAs
211
+ @pytest .mark .parametrize ('bool_op' , ['and_' , 'or_' , 'xor' ])
212
+ def test_bool_operators_with_nas (self , bool_op ):
213
+ # boolean &, |, ^ should work with object arrays and propagate NAs
213
214
214
- ops = ['and_' , 'or_' , 'xor' ]
215
- mask = ser .isna ()
216
- for bool_op in ops :
217
- func = getattr (operator , bool_op )
215
+ ser = Series (bdate_range ('1/1/2000' , periods = 10 ), dtype = object )
216
+ ser [::2 ] = np .nan
218
217
219
- filled = ser .fillna (ser [0 ])
218
+ func = getattr (operator , bool_op )
219
+ result = func (ser < ser [9 ], ser > ser [3 ])
220
220
221
- result = func (ser < ser [9 ], ser > ser [3 ])
221
+ mask = ser .isna ()
222
+ filled = ser .fillna (ser [0 ])
223
+ expected = func (filled < filled [9 ], filled > filled [3 ])
224
+ expected [mask ] = False
222
225
223
- expected = func (filled < filled [9 ], filled > filled [3 ])
224
- expected [mask ] = False
225
- assert_series_equal (result , expected )
226
+ assert_series_equal (result , expected )
226
227
227
228
def test_comparison_object_numeric_nas (self ):
228
229
ser = Series (np .random .randn (10 ), dtype = object )
@@ -376,10 +377,10 @@ def test_comparison_different_length(self):
376
377
b = Series ([2 , 3 , 4 ])
377
378
pytest .raises (ValueError , a .__eq__ , b )
378
379
379
- def test_comparison_label_based (self ):
380
+ def test_bool_opslabel_based (self ):
380
381
381
382
# GH 4947
382
- # comparisons should be label based
383
+ # boolean ops should be label based
383
384
384
385
a = Series ([True , False , True ], list ('bca' ))
385
386
b = Series ([False , True , False ], list ('abc' ))
@@ -1823,128 +1824,169 @@ def test_ops_datetimelike_align(self):
1823
1824
1824
1825
def test_operators_bitwise (self ):
1825
1826
# GH 9016: support bitwise op for integer types
1826
- index = list ('bca' )
1827
+ s_0123 = Series (range (4 ), dtype = 'int64' )
1828
+ s_1111 = Series ([1 ] * 4 , dtype = 'int8' )
1827
1829
1828
- s_tft = Series ([True , False , True ], index = index )
1829
- s_fff = Series ([False , False , False ], index = index )
1830
- s_tff = Series ([True , False , False ], index = index )
1831
- s_empty = Series ([])
1830
+ # We cannot wrap s111.astype(np.int32) with pd.Index because it
1831
+ # will case to int64
1832
+ res = s_0123 .astype (np .int16 ) | s_1111 .astype (np .int32 )
1833
+ expected = Series ([1 , 1 , 3 , 3 ], dtype = 'int32' )
1834
+ assert_series_equal (res , expected )
1832
1835
1833
- # TODO: unused
1834
- # s_0101 = Series([0, 1, 0, 1])
1836
+ def test_operators_bitwise_invalid (self ):
1837
+ # GH#9016: support bitwise op for integer types
1838
+ s_0123 = Series (range (4 ), dtype = 'int64' )
1839
+ s_1111 = Series ([1 ] * 4 , dtype = 'int8' )
1840
+
1841
+ with pytest .raises (TypeError ):
1842
+ s_1111 & 'a'
1843
+ with pytest .raises (TypeError ):
1844
+ s_1111 & ['a' , 'b' , 'c' , 'd' ]
1845
+ with pytest .raises (TypeError ):
1846
+ s_0123 & 3.14
1847
+ with pytest .raises (TypeError ):
1848
+ s_0123 & [0.1 , 4 , 3.14 , 2 ]
1835
1849
1850
+ def test_operators_bitwise_int_series_with_float_series (self ):
1851
+ # GH#9016: support bitwise op for integer types
1852
+ s_0123 = Series (range (4 ), dtype = 'int64' )
1853
+ s_ftft = Series ([False , True , False , True ])
1854
+ result = s_0123 & Series ([0.1 , 4 , - 3.14 , 2 ])
1855
+ assert_series_equal (result , s_ftft )
1856
+
1857
+ @pytest .mark .parametrize ('box' , [np .array , pd .Index , pd .Series ])
1858
+ def test_operators_bitwise_with_int_arraylike (self , box ):
1859
+ # GH#9016: support bitwise op for integer types
1860
+ # GH#??? allow for operating with Index
1836
1861
s_0123 = Series (range (4 ), dtype = 'int64' )
1837
1862
s_3333 = Series ([3 ] * 4 )
1838
1863
s_4444 = Series ([4 ] * 4 )
1839
1864
1840
- res = s_tft & s_empty
1841
- expected = s_fff
1865
+ res = s_0123 & box ( s_3333 )
1866
+ expected = Series ( range ( 4 ), dtype = 'int64' )
1842
1867
assert_series_equal (res , expected )
1843
1868
1844
- res = s_tft | s_empty
1845
- expected = s_tft
1869
+ res = s_0123 | box ( s_4444 )
1870
+ expected = Series ( range ( 4 , 8 ), dtype = 'int64' )
1846
1871
assert_series_equal (res , expected )
1847
1872
1848
- res = s_0123 & s_3333
1849
- expected = Series (range (4 ), dtype = 'int64' )
1873
+ s_1111 = Series ([1 ] * 4 , dtype = 'int8' )
1874
+ res = s_0123 & box (s_1111 )
1875
+ expected = Series ([0 , 1 , 0 , 1 ], dtype = 'int64' )
1850
1876
assert_series_equal (res , expected )
1851
1877
1852
- res = s_0123 | s_4444
1853
- expected = Series ( range ( 4 , 8 ), dtype = 'int64' )
1854
- assert_series_equal ( res , expected )
1878
+ def test_operators_bitwise_with_bool ( self ):
1879
+ # GH#9016: support bitwise op for integer types
1880
+ s_0123 = Series ( range ( 4 ), dtype = 'int64' )
1855
1881
1856
- s_a0b1c0 = Series ([1 ], list ('b' ))
1882
+ assert_series_equal (s_0123 & False , Series ([False ] * 4 ))
1883
+ assert_series_equal (s_0123 ^ False , Series ([False , True , True , True ]))
1884
+ assert_series_equal (s_0123 & [False ], Series ([False ] * 4 ))
1885
+ assert_series_equal (s_0123 & (False ), Series ([False ] * 4 ))
1857
1886
1858
- res = s_tft & s_a0b1c0
1859
- expected = s_tff . reindex ( list ( 'abc' ))
1860
- assert_series_equal ( res , expected )
1887
+ def test_operators_bitwise_with_integers ( self ):
1888
+ # GH#9016: support bitwise op for integer types
1889
+ index = list ( 'bca' )
1861
1890
1862
- res = s_tft | s_a0b1c0
1863
- expected = s_tft . reindex ( list ( 'abc' ) )
1864
- assert_series_equal ( res , expected )
1891
+ s_tft = Series ([ True , False , True ], index = index )
1892
+ s_fff = Series ([ False , False , False ], index = index )
1893
+ s_0123 = Series ( range ( 4 ), dtype = 'int64' )
1865
1894
1866
- n0 = 0
1867
- res = s_tft & n0
1895
+ res = s_tft & 0
1868
1896
expected = s_fff
1869
1897
assert_series_equal (res , expected )
1870
1898
1871
- res = s_0123 & n0
1899
+ res = s_0123 & 0
1872
1900
expected = Series ([0 ] * 4 )
1873
1901
assert_series_equal (res , expected )
1874
1902
1875
- n1 = 1
1876
- res = s_tft & n1
1903
+ res = s_tft & 1
1877
1904
expected = s_tft
1878
1905
assert_series_equal (res , expected )
1879
1906
1880
- res = s_0123 & n1
1907
+ res = s_0123 & 1
1881
1908
expected = Series ([0 , 1 , 0 , 1 ])
1882
1909
assert_series_equal (res , expected )
1883
1910
1884
- s_1111 = Series ([1 ] * 4 , dtype = 'int8' )
1885
- res = s_0123 & s_1111
1886
- expected = Series ([0 , 1 , 0 , 1 ], dtype = 'int64' )
1911
+ def test_operators_bitwise_with_reindexing (self ):
1912
+ # ops where reindeing needs to be done, so operating with a Series
1913
+ # makes sense but with an Index or array does not
1914
+ # GH#9016: support bitwise op for integer types
1915
+ index = list ('bca' )
1916
+
1917
+ s_tft = Series ([True , False , True ], index = index )
1918
+ s_fff = Series ([False , False , False ], index = index )
1919
+ s_tff = Series ([True , False , False ], index = index )
1920
+ s_empty = Series ([])
1921
+ s_a0b1c0 = Series ([1 ], list ('b' ))
1922
+ s_0123 = Series (range (4 ), dtype = 'int64' )
1923
+
1924
+ res = s_tft & s_empty
1925
+ expected = s_fff
1887
1926
assert_series_equal (res , expected )
1888
1927
1889
- res = s_0123 .astype (np .int16 ) | s_1111 .astype (np .int32 )
1890
- expected = Series ([1 , 1 , 3 , 3 ], dtype = 'int32' )
1928
+ res = s_tft | s_empty
1929
+ expected = s_tft
1930
+ assert_series_equal (res , expected )
1931
+
1932
+ res = s_tft & s_a0b1c0
1933
+ expected = s_tff .reindex (list ('abc' ))
1891
1934
assert_series_equal (res , expected )
1892
1935
1893
- pytest .raises (TypeError , lambda : s_1111 & 'a' )
1894
- pytest .raises (TypeError , lambda : s_1111 & ['a' , 'b' , 'c' , 'd' ])
1895
- pytest .raises (TypeError , lambda : s_0123 & np .NaN )
1896
- pytest .raises (TypeError , lambda : s_0123 & 3.14 )
1897
- pytest .raises (TypeError , lambda : s_0123 & [0.1 , 4 , 3.14 , 2 ])
1936
+ res = s_tft | s_a0b1c0
1937
+ expected = s_tft .reindex (list ('abc' ))
1938
+ assert_series_equal (res , expected )
1898
1939
1899
1940
# s_0123 will be all false now because of reindexing like s_tft
1900
1941
if compat .PY3 :
1901
1942
# unable to sort incompatible object via .union.
1902
1943
exp = Series ([False ] * 7 , index = ['b' , 'c' , 'a' , 0 , 1 , 2 , 3 ])
1903
1944
with tm .assert_produces_warning (RuntimeWarning ):
1904
- assert_series_equal (s_tft & s_0123 , exp )
1945
+ result = s_tft & s_0123
1946
+ assert_series_equal (result , exp )
1905
1947
else :
1906
1948
exp = Series ([False ] * 7 , index = [0 , 1 , 2 , 3 , 'a' , 'b' , 'c' ])
1907
- assert_series_equal (s_tft & s_0123 , exp )
1949
+ result = s_tft & s_0123
1950
+ assert_series_equal (result , exp )
1908
1951
1909
1952
# s_tft will be all false now because of reindexing like s_0123
1910
1953
if compat .PY3 :
1911
1954
# unable to sort incompatible object via .union.
1912
1955
exp = Series ([False ] * 7 , index = [0 , 1 , 2 , 3 , 'b' , 'c' , 'a' ])
1913
1956
with tm .assert_produces_warning (RuntimeWarning ):
1957
+ result = s_0123 & s_tft
1914
1958
assert_series_equal (s_0123 & s_tft , exp )
1915
1959
else :
1916
1960
exp = Series ([False ] * 7 , index = [0 , 1 , 2 , 3 , 'a' , 'b' , 'c' ])
1917
1961
assert_series_equal (s_0123 & s_tft , exp )
1918
1962
1919
- assert_series_equal (s_0123 & False , Series ([False ] * 4 ))
1920
- assert_series_equal (s_0123 ^ False , Series ([False , True , True , True ]))
1921
- assert_series_equal (s_0123 & [False ], Series ([False ] * 4 ))
1922
- assert_series_equal (s_0123 & (False ), Series ([False ] * 4 ))
1923
- assert_series_equal (s_0123 & Series ([False , np .NaN , False , False ]),
1924
- Series ([False ] * 4 ))
1963
+ def test_operators_bitwise_with_nans (self ):
1964
+ # with NaNs present op(series, series) works but op(series, index)
1965
+ # is not implemented
1966
+ # GH#9016: support bitwise op for integer types
1967
+ s_0123 = Series (range (4 ), dtype = 'int64' )
1968
+ result = s_0123 & Series ([False , np .NaN , False , False ])
1969
+ assert_series_equal (result , Series ([False ] * 4 ))
1925
1970
1926
1971
s_ftft = Series ([False , True , False , True ])
1927
- assert_series_equal (s_0123 & Series ([0.1 , 4 , - 3.14 , 2 ]), s_ftft )
1928
-
1929
1972
s_abNd = Series (['a' , 'b' , np .NaN , 'd' ])
1930
- res = s_0123 & s_abNd
1973
+ result = s_0123 & s_abNd
1931
1974
expected = s_ftft
1932
- assert_series_equal (res , expected )
1975
+ assert_series_equal (result , expected )
1933
1976
1934
1977
def test_scalar_na_cmp_corners (self ):
1935
1978
s = Series ([2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ])
1936
1979
1937
- def tester (a , b ):
1938
- return a & b
1939
-
1940
- pytest .raises (TypeError , tester , s , datetime (2005 , 1 , 1 ))
1980
+ with pytest .raises (TypeError ):
1981
+ s & datetime (2005 , 1 , 1 )
1941
1982
1942
1983
s = Series ([2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , datetime (2005 , 1 , 1 )])
1943
1984
s [::2 ] = np .nan
1944
1985
1945
1986
expected = Series (True , index = s .index )
1946
1987
expected [::2 ] = False
1947
- assert_series_equal (tester (s , list (s )), expected )
1988
+ result = s & list (s )
1989
+ assert_series_equal (result , expected )
1948
1990
1949
1991
d = DataFrame ({'A' : s })
1950
1992
# TODO: Fix this exception - needs to be fixed! (see GH5035)
@@ -1955,7 +1997,8 @@ def tester(a, b):
1955
1997
# https://github.com/pandas-dev/pandas/issues/5284
1956
1998
1957
1999
pytest .raises (ValueError , lambda : d .__and__ (s , axis = 'columns' ))
1958
- pytest .raises (ValueError , tester , s , d )
2000
+ with pytest .raises (ValueError ):
2001
+ s & d
1959
2002
1960
2003
# this is wrong as its not a boolean result
1961
2004
# result = d.__and__(s,axis='index')
0 commit comments