Minsky
Minsky

Reputation: 513

TypeError: conversion from Series to Decimal is not supported

Any ideas on how to convert a series (column) from float to decimal? I am on Python 3.6. I have read the Decimal documentation, but it offers no help.

df['rate'].dtype
Out[158]: dtype('float64')
Decimal(df['rate'])
Traceback (most recent call last):
  File "C:\Users\user\Anaconda3\lib\site-packages\IPython
   \core\interactiveshell.py", line 2862, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
    File "<ipython-input-159-88710e11f7cd>", line 1, in <module>
    Decimal(df['rate'])
 TypeError: conversion from Series to Decimal is not supported

Upvotes: 11

Views: 16598

Answers (1)

EdChum
EdChum

Reputation: 394101

You can't cast like this, you will need to do

df['rate'] = df['rate'].apply(Decimal)

pandas does support Decimal but you can't cast like that

Example:

In[28]:
from decimal import *
df = pd.DataFrame(np.random.randn(5,3), columns=list('abc'))
df['a'] = df['a'].apply(Decimal)
df

Out[28]: 
                                                   a         b         c
0  -1.6122557830197199457700207858579233288764953... -1.865243 -0.836893
1  0.96962430214434858211092205237946473062038421... -0.105823 -0.842267
2  -0.9113389075755260471112251252634450793266296... -0.351389 -0.183489
3  1.22765470106414120721183280693367123603820800... -1.232627 -0.067909
4  -0.0376339704393285762185072940155805554240942... -0.445606 -0.080623

the dtype will still show object but the dtype really is Decimal:

In[29]:
type(df['a'].iloc[0])

Out[29]: decimal.Decimal

If you use astype(Decimal) it will look like it worked but it doesn't:

In[38]:
df['b'].astype(Decimal)

Out[38]: 
0    -1.86524
1   -0.105823
2   -0.351389
3    -1.23263
4   -0.445606
Name: b, dtype: object

If we try to assign this back:

In[39]:
df['b'] = df['b'].astype(Decimal)
type(df['b'].iloc[0])

Out[39]: float

As pointed out by @JonClements and I agree it is ill-advised to use non-native numpy types as you lose any vectorisation in particular with arithmetic operations, additionally the dtype may be converted when you perform some operation on it which then loses your original intention

Upvotes: 14

Related Questions