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