@@ -222,18 +222,40 @@ def f(self, other, axis=default_axis, level=None, fill_value=None):
222
222
223
223
return f
224
224
225
- def flex_comp_method (op , name , default_axis = 'columns' ):
225
+ def _flex_comp_method (op , name , default_axis = 'columns' ):
226
+
227
+ def na_op (x , y ):
228
+ try :
229
+ result = op (x , y )
230
+ except TypeError :
231
+ xrav = x .ravel ()
232
+ result = np .empty (x .size , dtype = x .dtype )
233
+ if isinstance (y , np .ndarray ):
234
+ yrav = y .ravel ()
235
+ mask = notnull (xrav ) & notnull (yrav )
236
+ result [mask ] = op (xrav [mask ], yrav [mask ])
237
+ else :
238
+ mask = notnull (xrav )
239
+ result [mask ] = op (xrav [mask ], y )
240
+
241
+ if op == operator .ne :
242
+ np .putmask (result , - mask , False )
243
+ else :
244
+ np .putmask (result , - mask , False )
245
+ result = result .reshape (x .shape )
246
+
247
+ return result
226
248
227
249
@Appender ('Wrapper for flexible comparison methods %s' % name )
228
250
def f (self , other , axis = default_axis , level = None ):
229
251
if isinstance (other , DataFrame ): # Another DataFrame
230
- return self ._flex_compare_frame (other , op , level )
252
+ return self ._flex_compare_frame (other , na_op , level )
231
253
232
254
elif isinstance (other , Series ):
233
255
try :
234
- return self ._combine_series (other , op , None , axis , level )
256
+ return self ._combine_series (other , na_op , None , axis , level )
235
257
except Exception :
236
- return self ._combine_series_infer (other , op )
258
+ return self ._combine_series_infer (other , na_op )
237
259
238
260
elif isinstance (other , (list , tuple )):
239
261
if axis is not None and self ._get_axis_name (axis ) == 'index' :
@@ -242,9 +264,9 @@ def f(self, other, axis=default_axis, level=None):
242
264
casted = Series (other , index = self .columns )
243
265
244
266
try :
245
- return self ._combine_series (casted , op , None , axis , level )
267
+ return self ._combine_series (casted , na_op , None , axis , level )
246
268
except Exception :
247
- return self ._combine_series_infer (casted , op )
269
+ return self ._combine_series_infer (casted , na_op )
248
270
249
271
elif isinstance (other , np .ndarray ):
250
272
if other .ndim == 1 :
@@ -254,27 +276,28 @@ def f(self, other, axis=default_axis, level=None):
254
276
casted = Series (other , index = self .columns )
255
277
256
278
try :
257
- return self ._combine_series (casted , op , None , axis , level )
279
+ return self ._combine_series (casted , na_op , None , axis ,
280
+ level )
258
281
except Exception :
259
- return self ._combine_series_infer (casted , op )
282
+ return self ._combine_series_infer (casted , na_op )
260
283
261
284
elif other .ndim == 2 :
262
285
casted = DataFrame (other , index = self .index ,
263
286
columns = self .columns )
264
- return self ._flex_compare_frame (casted , op , level )
287
+ return self ._flex_compare_frame (casted , na_op , level )
265
288
266
289
else : # pragma: no cover
267
290
raise ValueError ("Bad argument shape" )
268
291
269
292
else :
270
- return self ._combine_const (other , op )
293
+ return self ._combine_const (other , na_op )
271
294
272
295
f .__name__ = name
273
296
274
297
return f
275
298
276
299
277
- def comp_method (func , name ):
300
+ def _comp_method (func , name ):
278
301
@Appender ('Wrapper for comparison method %s' % name )
279
302
def f (self , other ):
280
303
if isinstance (other , DataFrame ): # Another DataFrame
@@ -666,19 +689,19 @@ def __neg__(self):
666
689
return self ._wrap_array (arr , self .axes , copy = False )
667
690
668
691
# Comparison methods
669
- __eq__ = comp_method (operator .eq , '__eq__' )
670
- __ne__ = comp_method (operator .ne , '__ne__' )
671
- __lt__ = comp_method (operator .lt , '__lt__' )
672
- __gt__ = comp_method (operator .gt , '__gt__' )
673
- __le__ = comp_method (operator .le , '__le__' )
674
- __ge__ = comp_method (operator .ge , '__ge__' )
675
-
676
- eq = flex_comp_method (operator .eq , 'eq' )
677
- ne = flex_comp_method (operator .ne , 'ne' )
678
- gt = flex_comp_method (operator .gt , 'gt' )
679
- lt = flex_comp_method (operator .lt , 'lt' )
680
- ge = flex_comp_method (operator .ge , 'ge' )
681
- le = flex_comp_method (operator .le , 'le' )
692
+ __eq__ = _comp_method (operator .eq , '__eq__' )
693
+ __ne__ = _comp_method (operator .ne , '__ne__' )
694
+ __lt__ = _comp_method (operator .lt , '__lt__' )
695
+ __gt__ = _comp_method (operator .gt , '__gt__' )
696
+ __le__ = _comp_method (operator .le , '__le__' )
697
+ __ge__ = _comp_method (operator .ge , '__ge__' )
698
+
699
+ eq = _flex_comp_method (operator .eq , 'eq' )
700
+ ne = _flex_comp_method (operator .ne , 'ne' )
701
+ gt = _flex_comp_method (operator .gt , 'gt' )
702
+ lt = _flex_comp_method (operator .lt , 'lt' )
703
+ ge = _flex_comp_method (operator .ge , 'ge' )
704
+ le = _flex_comp_method (operator .le , 'le' )
682
705
683
706
def dot (self , other ):
684
707
"""
0 commit comments