@@ -616,6 +616,9 @@ def where(self, cond, other=nan, inplace=False):
616616 if len (cond ) != len (self ):
617617 raise ValueError ('condition must have same length as series' )
618618
619+ if not cond .dtype == np .bool_ :
620+ cond = cond .astype (np .bool_ )
621+
619622 ser = self if inplace else self .copy ()
620623 if not isinstance (other , (list , tuple , np .ndarray )):
621624 ser ._set_with (~ cond , other )
@@ -672,10 +675,11 @@ def __setitem__(self, key, value):
672675 # Could not hash item
673676
674677 if _is_bool_indexer (key ):
678+ #import pdb; pdb.set_
675679 key = self ._check_bool_indexer (key )
676- key = np . asarray ( key , dtype = bool )
677-
678- self ._set_with (key , value )
680+ self . where ( ~ key ,value , inplace = True )
681+ else :
682+ self ._set_with (key , value )
679683
680684 def _set_with (self , key , value ):
681685 # other: fancy integer or otherwise
@@ -707,13 +711,7 @@ def _set_with(self, key, value):
707711 else :
708712 return self ._set_values (key , value )
709713 elif key_type == 'boolean' :
710-
711- # scalar setting with boolean key
712- if np .isscalar (value ):
713714 self ._set_values (key , value )
714- # we have a key mask and a value that is np.array like
715- else :
716- np .putmask (self .values , key , value )
717715 else :
718716 self ._set_labels (key , value )
719717
@@ -758,6 +756,12 @@ def _check_bool_indexer(self, key):
758756 raise ValueError ('cannot index with vector containing '
759757 'NA / NaN values' )
760758
759+ # coerce to bool type
760+ if not hasattr (result , 'shape' ):
761+ result = np .array (result )
762+ if not result .dtype == np .bool_ :
763+ result = result .astype (np .bool_ )
764+
761765 return result
762766
763767 def __setslice__ (self , i , j , value ):
@@ -1115,6 +1119,15 @@ def iteritems(self):
11151119 __le__ = _comp_method (operator .le , '__le__' )
11161120 __eq__ = _comp_method (operator .eq , '__eq__' )
11171121 __ne__ = _comp_method (operator .ne , '__ne__' )
1122+
1123+ # inversion
1124+ def __neg__ (self ):
1125+ arr = operator .neg (self .values )
1126+ return Series (arr , self .index , name = self .name )
1127+
1128+ def __invert__ (self ):
1129+ arr = operator .inv (self .values )
1130+ return Series (arr , self .index , name = self .name )
11181131
11191132 # binary logic
11201133 __or__ = _bool_method (operator .or_ , '__or__' )
0 commit comments