2016-08-03 14 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で起こるのではないかと思います。あなたはそれがfloatとして認識されます1234589890878708980.67ようないくつかの瞬間値を持っており、例えば、瞬時に精度が失われた場合:

>>> 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ファイルから読み込む場合、どう

はい:)

私の知る限りPythonのcsv読者は、任意の型変換を行ってはならない、と後で自由に変換できる文字列を取得します。そうでない場合は、pandas.read_csvを使用している場合は、dtypefloat_precision引数を設定することもできます(パンダにプレーンストリングをロードし、後で値を自分自身に変換させることもできます)。

+0

これは実際に機能しました!しかし、このメソッドが正常に動作するためには、値が最初の文字列でなければならないことを正しく理解していますか? 'csv'ファイルからフロートを読み込むとどうなりますか? –

+0

@SergeyBushmanov私はちょうど答えが更新された。 – starrify

+0

ありがとうございます、あなたの提案に絶対に同意してください(すでにいくつか試したこともあります)。知識があれば 'np.float128'や' np.longdouble'を使って精度を上げる方法はありますか?何らかの理由で私の試みが失敗した.... –

関連する問題