はじめに
私はデータのラベル付け等のため、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 の仕様と制限
今回、私の元で発生した事例では元データは変更せずに残しており問題はありませんでしたが、結構ゾッとするというか今回知ることができてよかったなぁという次第です。