2017-11-13 137 views
2

シリーズ(列)を10進数に変換する方法に関するアイデアはありますか?私はPython 3.6です。 Decimalのドキュメントを読んだことがありますが、何の助けにもなりません。TypeError:Seriesから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 

答えて

2

あなたはこのようにキャストすることはできません、あなたは

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は実際に0123です:

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はperfあなたの元の意図を失うような操作をしてください。

+1

OPがこれをやりたいことに応じて - 「浮動小数点数」から 'Decimal'を作るのは時間の無駄かもしれません。その時点で既に回避されています。基盤となる配列などでは、基底操作が高価で、特定の型に対して最適化されません。 –

+0

@JonClementsは真ですが、何らかの理由でこの種の質問が頻繁にポップアップしますが、ネイティブnumpyのタイプ – EdChum

+0

ああ、間違いなく、Decimalが本当に必要であり、それが入力の段階で取得されるのが最善です( 'converters = {...} 'などを使用しているかもしれません)。あなたがすでにフロートで遊んでいたときに魔法の弾丸になりなさい:) –

関連する問題