質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

3304閲覧

pandasでTSVで保存すると小数点の桁数が変わってしまう

barobaro

総合スコア1286

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

2クリップ

投稿2019/08/09 00:53

編集2019/08/09 01:11

前提・実現したいこと

TSVを読み込み、TSVまたはCSVで保存すると小数点の桁数が変わらないようにしたい

発生している問題・エラーメッセージ

TSVを読み込み、TSVで保存すると小数点の桁数が変わってしまう

元データ

1 3.811 2 28.535 3 3.538 4 8.725 5 1.0 6 44.609

保存すると

1 3.8110000000000004 2 28.535 3 3.5380000000000003 4 8.725 5 1.0 6 44.608999999999995

該当のソースコード

python

1import io 2import pandas as pd 3 4data = """\ 5id,data 61,3.811 72,28.535 83,3.538 94,8.725 105,1.0 116,44.609 12""" 13 14df = pd.read_csv(io.StringIO(data)) 15 16print(df.dtypes) 17print(df) 18 19df.to_csv("result.tsv", sep='\t', index=False, header=False)

試したこと

dfをprintで表示するとデータ通り

リストだとそのまま保存される

python

1import pandas as pd 2 3df = pd.DataFrame({ 4 "id": [1, 2, 3, 4, 5, 6], 5 "data": [3.811, 28.535, 3.538, 8.725, 1.0, 44.609] 6}) 7 8print(df.dtypes) 9print(df) 10 11df.to_csv("result1.tsv", sep='\t', index=False, header=False)
1 3.811 2 28.535 3 3.538 4 8.725 5 1.0 6 44.609

補足情報(FW/ツールのバージョンなど)

Windows10 1903 64bit
Intel Core i7-4770 @3.4GHz
python3.7.3
pandas==0.25.0
numpy==1.17.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

pandas.read_csvの時点で内部的に値が(ほんの僅かに)狂っています。printだと見えませんが、数値リテラルで書いた方と比較したりするとわかります。

python

1import io 2import pandas as pd 3 4data = """\ 5id,data 61,3.811 72,28.535 83,3.538 94,8.725 105,1.0 116,44.609 12""" 13 14df1 = pd.read_csv(io.StringIO(data)) 15df2 = pd.DataFrame({"id": [1, 2, 3, 4, 5, 6], 16 "data": [3.811, 28.535, 3.538, 8.725, 1.0, 44.609]}, 17 columns=["id", "data"]) 18 19print(df1["data"] == df2["data"]) 20""" => 210 False 221 True 232 False 243 True 254 True 265 False 27Name: data, dtype: bool 28"""

詳細は確認していませんが、pandas.read_csvfloat_precisionオプションに"high"を指定するとよさげです。

python

1import io 2import pandas as pd 3 4data = """\ 5id,data 61,3.811 72,28.535 83,3.538 94,8.725 105,1.0 116,44.609 12""" 13 14df1 = pd.read_csv(io.StringIO(data), float_precision="high") # ここだけ変更 15df2 = pd.DataFrame({"id": [1, 2, 3, 4, 5, 6], 16 "data": [3.811, 28.535, 3.538, 8.725, 1.0, 44.609]}, 17 columns=["id", "data"]) 18 19print(df1["data"] == df2["data"]) 20""" => 210 True 221 True 232 True 243 True 254 True 265 True 27Name: data, dtype: bool 28""" 29

pandas.read_csv — pandas 0.25.0 documentation

投稿2019/08/09 02:42

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

barobaro

2019/08/09 04:20

pandas.read_csvの時点で誤差が発生していたのですね 確認方法まで教えていただきよくわかりました。 float_precisionを使うとできそうです。 どうもありがとうございます。
guest

0

詳しいわけではありませんが、一応近しい形にはできたので回答致します。
to_csvにはfloat_formatオプションがあるようなのでこれで指定が可能です。
ただ、表示とそのまま同じにはできないようです。少し試してみましたが一番近しいのは「%g」かなと思いました。
詳細については別途ドキュメントをご確認ください。

python

1df.to_csv(output_path, sep='\t', index=False, header=False, float_format='%g')

※どなたか補足して頂けると助かります。

投稿2019/08/09 02:26

yamap55

総合スコア1376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

barobaro

2019/08/09 04:22

float_formatも使えそうですね。 どうもありがとうございます。
guest

0

PC内部の処理で小数点数が上記のようになってしまうことがあります。
ほぼ同じ数値なのでこのままでも計算には支障ないことが多いと思います。

pandasのデータを丸めたいのであれば、pandasのrouod()※一般的な四捨五入ではありません
か、decimalモジュールのquantize()で実現できそうです。
※詳細はチュートリアルをご覧ください

投稿2019/08/09 02:43

meg_

総合スコア10577

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

barobaro

2019/08/09 04:26

計算上は問題ないのですが表記上約500件中3件だけ桁数が多くてどうにかならないかなと。 いろいろなやり方があって勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問