2016-08-03 95 views
1

我在Python轉換還有一些浮標(有的長一些短)爲字符串並獲得意想不到的結果(?):損失的精度熊貓

案例1

pd.options.display.float_format = '{:.2f}'.format 
pd.DataFrame({'x': [12345.67]}) 

      x 
0 12345.67 

案例2

pd.DataFrame({'x': [1234589890808980.67]}) 

         x 
0 1234589890808980.75 

案例3

pd.DataFrame({'x': [1234589890878708980.67]}) 

         x 
0 1234589890878708992.00 

我甚至嘗試dtypes 和np.longdouble,但收效不大。

請問有人可以解釋一下這裏發生了什麼,並且在情況2和3中可以「正確」轉換嗎?

謝謝!

回答

3

恐怕這個「問題」發生在Python(而不是熊貓)方面。當你有一個像1234589890878708980.67它視爲float一些瞬時值瞬間失去精度,例如:

>>> 1234589890878708980.67 
1.234589890878709e+18 
>>> 1234589890878708980.67 == 1234589890878708980.6712345 
True 

你可以嘗試像decimal.Decimal

>>> import decimal 
>>> pd.DataFrame({'x': [decimal.Decimal('1234589890808980.67')]}) 
        x 
0 1234589890808980.67 

編輯:

加入OP的評論中有幾個問題。

但是,我是否理解這個方法正常工作的值應該是字符串呢?

是:)

如果什麼它是從CSV文件中讀取浮動?

AFAIK Python的csv閱讀器不應該執行任何類型轉換,您將得到可以隨後轉換的字符串。否則,如果您使用的是pandas.read_csv,則可以嘗試設置dtypefloat_precision參數(您也可以讓大熊貓載入純字符串,並自己稍後轉換值)。

+0

這確實工作!但是,我是否理解這個方法正常工作的價值應該是字符串呢?如果它是從'csv'文件讀取的浮點數? –

+0

@SergeyBushmanov我剛剛更新了答案。 – starrify

+0

謝謝,絕對同意你的建議(甚至已經嘗試了一些)。有沒有辦法通過'np.float128'或'np.longdouble'來提高精度?由於某種原因,我的嘗試失敗...... –