@@ -2747,16 +2747,8 @@ def prod(self, axis=0, skipna=True, level=None):
2747
2747
if level is not None :
2748
2748
return self ._agg_by_level ('prod' , axis = axis , level = level ,
2749
2749
skipna = skipna )
2750
-
2751
- values , axis_labels = self ._get_agg_data (axis , numeric_only = True )
2752
-
2753
- if skipna and not issubclass (values .dtype .type , np .integer ):
2754
- values [np .isnan (values )] = 1
2755
- result = values .prod (axis )
2756
- count = self .count (axis , numeric_only = True )
2757
- result [count == 0 ] = nan
2758
-
2759
- return Series (result , index = axis_labels )
2750
+ return self ._reduce (nanops .nanprod , axis = axis , skipna = skipna ,
2751
+ numeric_only = None )
2760
2752
_add_stat_doc (prod , 'product' , 'product' ,
2761
2753
na_action = 'NA/null values are treated as 1' )
2762
2754
product = prod
@@ -2765,30 +2757,8 @@ def median(self, axis=0, skipna=True, level=None):
2765
2757
if level is not None :
2766
2758
return self ._agg_by_level ('median' , axis = axis , level = level ,
2767
2759
skipna = skipna )
2768
-
2769
- frame = self ._get_numeric_data ()
2770
-
2771
- if axis == 0 :
2772
- values = frame .values .T
2773
- result_index = frame .columns
2774
- elif axis == 1 :
2775
- values = frame .values
2776
- result_index = self .index
2777
- else :
2778
- raise ValueError ('axis must be in {0, 1}' )
2779
-
2780
- def get_median (x ):
2781
- mask = notnull (x )
2782
- if not skipna and not mask .all ():
2783
- return np .nan
2784
- return lib .median (x [mask ])
2785
-
2786
- if values .dtype != np .float64 :
2787
- values = values .astype ('f8' )
2788
-
2789
- medians = [get_median (arr ) for arr in values ]
2790
- return Series (medians , index = result_index )
2791
-
2760
+ return self ._reduce (nanops .nanmedian , axis = axis , skipna = skipna ,
2761
+ numeric_only = None )
2792
2762
_add_stat_doc (median , 'median' , 'median' )
2793
2763
2794
2764
def mad (self , axis = 0 , skipna = True , level = None ):
@@ -2852,7 +2822,11 @@ def _reduce(self, op, axis=0, skipna=True, numeric_only=None):
2852
2822
result = f (values )
2853
2823
2854
2824
if result .dtype == np .object_ :
2855
- result = result .astype ('f8' )
2825
+ try :
2826
+ result = result .astype ('f8' )
2827
+ except (ValueError , TypeError ):
2828
+ pass
2829
+
2856
2830
return Series (result , index = labels )
2857
2831
2858
2832
def idxmin (self , axis = 0 , skipna = True ):
0 commit comments