5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonAdvent Calendar 2022

Day 17

pandas.DataFrame.to_excel()で桁数が大きい数値を出力したら値が変わってしまった話

Last updated at Posted at 2022-12-17

はじめに

私はデータのラベル付け等のため、DataFrameから一部を切り出して一度to_excelにてExcelファイルに出力してデータの手編集を行うことがあります。
その中で、データの値が元のDataFrameから変更されている事があったため、備忘録として残しておきます。

事象

16~19桁の数値が格納されたDataFrameを用意します。

import pandas as pd

df = pd.DataFrame([
    1234567890123456,
    12345678901234567,
    123456789012345678,
    1234567890123456789,
])

display(df)

確認のため出力した結果が以下になります。

0
0 1234567890123456
1 12345678901234567
2 123456789012345678
3 1234567890123456789

このDataFrameを一度to_excelでExcelfileに出力し、そのファイルを再度読み込みます。

# 一度出力
df.to_excel('test.xlsx', index=False)

# 再度読み込み
df_ = pd.read_excel('test.xlsx')
display(df_)

すると、値の16桁目くらいから何やら変わってしまうことに気づくかと思います。

0
0 1234567890123456
1 12345678901234570
2 123456789012345696
3 1234567890123457024

ちなみに、to_csvにてCSVファイルに出力した場合はこの事象は起こりません。

# 一度出力
df.to_csv('test.csv', index=False)
# 再度読み込み
df_ = pd.read_csv('test.csv')
display(df_)
0
0 1234567890123456
1 12345678901234567
2 123456789012345678
3 1234567890123456789

原因

原因としては、Excelの数値型の上限を超えてしまっているためでした。
Excelの有効桁数は15桁となっていますので、今回の例のような16桁以上だと正確な値が保証されません。
Excel の仕様と制限

今回、私の元で発生した事例では元データは変更せずに残しており問題はありませんでしたが、結構ゾッとするというか今回知ることができてよかったなぁという次第です。

参考資料

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?