import pandas as pd
from decimal import Decimal

df = pd.DataFrame()
df['a'] = pd.Series(['a', 'b', 'a'])
df['b'] = pd.Series([Decimal(x) for x in [1, 2, 3]])
df.pivot_table(columns='a', values='b')

Results in:

DataError                                 Traceback (most recent call last)
<ipython-input-8-158f4a12f2dd> in <module>()
      5 df['a'] = pd.Series(['a', 'b', 'a'])
            6 df['b'] = pd.Series([Decimal(x) for x in [1, 2, 3]])
        ----> 7 df.pivot_table(columns='a', values='b')

/home/user/anaconda/envs/fdb/lib/python2.7/site-packages/pandas/tools/pivot.pyc in pivot_table(data, values, index, columns, aggfunc, fill_value, margins, dropna)
    109
        110     grouped = data.groupby(keys)
    --> 111     agged = grouped.agg(aggfunc)
        112
            113     table = agged

/home/user/anaconda/envs/fdb/lib/python2.7/site-packages/pandas/core/groupby.pyc in agg(self, func, *args, **kwargs)
    683     @Appender(_agg_doc)
        684     def agg(self, func, *args, **kwargs):
    --> 685         return self.aggregate(func, *args, **kwargs)
        686
            687     def _iterate_slices(self):

/home/user/anaconda/envs/fdb/lib/python2.7/site-packages/pandas/core/groupby.pyc in aggregate(self, arg, *args, **kwargs)
   2635     def aggregate(self, arg, *args, **kwargs):
      2636         if isinstance(arg, compat.string_types):
      -> 2637             return getattr(self, arg)(*args, **kwargs)
         2638
        2639         result = OrderedDict()

/home/user/anaconda/envs/fdb/lib/python2.7/site-packages/pandas/core/groupby.pyc in mean(self)
    698         """
    699         try:
--> 700             return self._cython_agg_general('mean')
    701         except GroupByError:
    702             raise

/home/user/anaconda/envs/fdb/lib/python2.7/site-packages/pandas/core/groupby.pyc in _cython_agg_general(self, how, numeric_only)
   2558 
   2559     def _cython_agg_general(self, how, numeric_only=True):
-> 2560         new_items, new_blocks = self._cython_agg_blocks(how, numeric_only=numeric_only)
   2561         return self._wrap_agged_blocks(new_items, new_blocks)
   2562 

/home/user/anaconda/envs/fdb/lib/python2.7/site-packages/pandas/core/groupby.pyc in _cython_agg_blocks(self, how, numeric_only)
   2605 
   2606         if len(new_blocks) == 0:
-> 2607             raise DataError('No numeric types to aggregate')
   2608 
   2609         return data.items, new_blocks

DataError: No numeric types to aggregate

But works fine for ints/floats:

df = pd.DataFrame()
df['a'] = pd.Series(['a', 'b', 'a'])
df['b'] = pd.Series([float(x) for x in [1, 2, 3]])
df.pivot_table(columns='a', values='b')

Out:

a
a    2
b    2
Name: b, dtype: int64

Comment From: sinhrks

Thanks for the report. It is because Decimal is stored as object dtype internally. You must specify built-in sum via aggfunc which supports Decimal.

df.dtypes
# a    object
# b    object
# dtype: object

df.pivot_table(columns='a', values='b', aggfunc=sum)
# a
# a    4
# b    2
# Name: b, dtype: object