【问题标题】:TypeError: conversion from Series to Decimal is not supportedTypeError:不支持从系列到小数的转换
【发布时间】:2018-04-26 06:21:56
【问题描述】:

关于如何将系列(列)从浮点数转换为十进制数的任何想法?我在 Python 3.6 上。我已经阅读了 Decimal 文档,但它没有提供任何帮助。

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

【问题讨论】:

    标签: python-3.x pandas numpy decimal


    【解决方案1】:

    你不能这样投,你需要这样做

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

    pandas 确实支持Decimal,但你不能那样投射

    例子:

    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
    

    dtype 仍将显示object,但dtype 确实是Decimal

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

    如果您使用astype(Decimal),它看起来会起作用,但实际上不起作用:

    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
    

    如果我们尝试将其分配回去:

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

    正如@JonClements 所指出的,我同意不建议使用非本机 numpy 类型,因为您会丢失任何矢量化,尤其是算术运算,此外,当您对其执行某些操作时,dtype 可能会被转换,然后失去了初衷

    【讨论】:

    • 取决于 OP 想要这样做 - 从 float 创建 Decimal 很可能是浪费时间 - 很可能是试图避免的事情已经发生了观点。底层操作将是昂贵的,并且没有针对底层数组等的特定类型进行优化......
    • @JonClements 是的,但出于某种原因,这种问题确实会不时出现,我总是建议不要使用本机 numpy 类型
    • 哦,当然,但如果真的需要 Decimal 并且需要它,最好在输入阶段获得它(可能使用 converters={...} 或其他),不要认为它会变魔术当你已经玩过花车时的子弹:)
    猜你喜欢
    • 2021-09-26
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-08
    • 2011-10-16
    • 2023-03-30
    相关资源
    最近更新 更多