99import warnings
1010
1111from pandas .core .dtypes .missing import isna , notna
12+ from pandas .core .dtypes .common import is_sparse
1213
1314from pandas .compat .numpy import function as nv
1415from pandas .core .index import Index , _ensure_index , InvalidIndexError
1718from pandas .core import generic
1819import pandas .core .common as com
1920import pandas .core .ops as ops
20- import pandas ._libs .index as libindex
2121from pandas .util ._decorators import Appender
2222
2323from pandas .core .sparse .array import (
@@ -277,8 +277,13 @@ def __array_wrap__(self, result, context=None):
277277 else :
278278 fill_value = self .fill_value
279279
280+ # Assume: If result size matches, old sparse index is valid (ok???)
281+ if np .size (result ) == self .sp_index .npoints :
282+ sp_index = self .sp_index
283+ else :
284+ sp_index = None
280285 return self ._constructor (result , index = self .index ,
281- sparse_index = self . sp_index ,
286+ sparse_index = sp_index ,
282287 fill_value = fill_value ,
283288 copy = False ).__finalize__ (self )
284289
@@ -479,7 +484,7 @@ def set_value(self, label, value, takeable=False):
479484
480485 Returns
481486 -------
482- series : SparseSeries
487+ self : SparseSeries
483488 """
484489 warnings .warn ("set_value is deprecated and will be removed "
485490 "in a future release. Please use "
@@ -488,35 +493,16 @@ def set_value(self, label, value, takeable=False):
488493 return self ._set_value (label , value , takeable = takeable )
489494
490495 def _set_value (self , label , value , takeable = False ):
491- values = self .to_dense ()
492-
493- # if the label doesn't exist, we will create a new object here
494- # and possibly change the index
495- new_values = values ._set_value (label , value , takeable = takeable )
496- if new_values is not None :
497- values = new_values
498- new_index = values .index
499- values = SparseArray (values , fill_value = self .fill_value ,
500- kind = self .kind )
501- self ._data = SingleBlockManager (values , new_index )
502- self ._index = new_index
496+ self ._data = self ._data .copy ()
497+ try :
498+ idx = self .index .get_loc (label )
499+ except KeyError :
500+ idx = len (self )
501+ self ._data .axes [0 ] = self ._data .index .append (Index ([label ]))
502+ self ._data = self ._data .setitem (indexer = idx , value = value )
503+ return self
503504 _set_value .__doc__ = set_value .__doc__
504505
505- def _set_values (self , key , value ):
506-
507- # this might be inefficient as we have to recreate the sparse array
508- # rather than setting individual elements, but have to convert
509- # the passed slice/boolean that's in dense space into a sparse indexer
510- # not sure how to do that!
511- if isinstance (key , Series ):
512- key = key .values
513-
514- values = self .values .to_dense ()
515- values [key ] = libindex .convert_scalar (values , value )
516- values = SparseArray (values , fill_value = self .fill_value ,
517- kind = self .kind )
518- self ._data = SingleBlockManager (values , self .index )
519-
520506 def to_dense (self , sparse_only = False ):
521507 """
522508 Convert SparseSeries to a Series.
@@ -542,8 +528,10 @@ def to_dense(self, sparse_only=False):
542528 index = self .index .take (int_index .indices )
543529 return Series (self .sp_values , index = index , name = self .name )
544530 else :
545- return Series (self .values .to_dense (), index = self .index ,
546- name = self .name )
531+ values = self .values
532+ if is_sparse (values ):
533+ values = values .to_dense ()
534+ return Series (values , index = self .index , name = self .name )
547535
548536 @property
549537 def density (self ):
0 commit comments