@@ -2890,39 +2890,32 @@ def transform(self, func, *args, **kwargs):
2890
2890
lambda : getattr (self , func )(* args , ** kwargs ))
2891
2891
2892
2892
# reg transform
2893
- dtype = self ._selected_obj .dtype
2894
- result = self ._selected_obj .values .copy ()
2895
-
2893
+ klass = self ._selected_obj .__class__
2894
+ results = []
2896
2895
wrapper = lambda x : func (x , * args , ** kwargs )
2897
- for i , ( name , group ) in enumerate ( self ) :
2896
+ for name , group in self :
2898
2897
object .__setattr__ (group , 'name' , name )
2899
2898
res = wrapper (group )
2900
2899
2901
2900
if hasattr (res , 'values' ):
2902
2901
res = res .values
2903
2902
2904
- # may need to astype
2905
- try :
2906
- common_type = np .common_type (np .array (res ), result )
2907
- if common_type != result .dtype :
2908
- result = result .astype (common_type )
2909
- except Exception as exc :
2910
- # date math can cause type of result to change
2911
- if i == 0 and (is_datetime64_dtype (result .dtype ) or
2912
- is_timedelta64_dtype (result .dtype )):
2913
- try :
2914
- dtype = res .dtype
2915
- except Exception as exc :
2916
- dtype = type (res )
2917
- result = np .empty_like (result , dtype )
2918
-
2919
2903
indexer = self ._get_index (name )
2920
- result [indexer ] = res
2904
+ s = klass (res , indexer )
2905
+ results .append (s )
2921
2906
2922
- result = _possibly_downcast_to_dtype (result , dtype )
2923
- return self ._selected_obj .__class__ (result ,
2924
- index = self ._selected_obj .index ,
2925
- name = self ._selected_obj .name )
2907
+ from pandas .tools .concat import concat
2908
+ result = concat (results ).sort_index ()
2909
+
2910
+ # we will only try to coerce the result type if
2911
+ # we have a numeric dtype
2912
+ dtype = self ._selected_obj .dtype
2913
+ if is_numeric_dtype (dtype ):
2914
+ result = _possibly_downcast_to_dtype (result , dtype )
2915
+
2916
+ result .name = self ._selected_obj .name
2917
+ result .index = self ._selected_obj .index
2918
+ return result
2926
2919
2927
2920
def _transform_fast (self , func ):
2928
2921
"""
0 commit comments