はじめに
データでは有効数字の概念がとても大事である
特に誰かにデータを見せる時は桁数を可読性のためにも揃える必要がある
ここでは基本的なpandasの四捨五入と(偶数丸め)と一般的な四捨五入を紹介する
環境
window 10
python version: 3.7.8
pandas version: 1.3.5
Code
エクセルデータの読み込み
import pandas as pd
df = pd.read_excel('./data.xlsx')
print(df)
小数点第1位になるように五捨五入(偶数丸め)
df = df.round(1)
print(df)
0.05 -> 0.00
0.25 -> 0.20
このようにpandasではなるべく偶数になるように五捨五入が行われる
我々が高校までの教科で勉強したような四捨五入とは異なるが、五捨五入のほうが統計学的には良いとされるらしい
小数点第0位(整数)になるように五捨五入(偶数丸め)
df = df.round(0)
print(df)
1桁(整数)で五捨五入(偶数丸め)
df = df.round(-1)
print(df)
125 -> 120
145 -> 140
floatではない3桁のintでも同じく五捨五入が行われた
一般的な四捨五入のための回避方法
pandasは統計のために用いられるライブラリーなので、五捨五入(偶数丸め)が基本である。
しかし、メーカーなどは会社によって基準が異なるので、五捨五入だけを使うわけにはいかない。
よって少しの努力で一般的な四捨五入を再現する。
df = pd.read_excel('./data.xlsx')
def normal_round(df):
df = df + 0.01
return df
print('\n before')
print(df)
# 五捨五入(銀行丸め)
print('\n rounding')
print(df.round(1))
# 0.01を加える
df.Point_2 = normal_round(df.Point_2)
df.Point_1 = normal_round(df.Point_1)
# 四捨五入
print('\n normal rounding')
print(df.round(1))
小数点第2位で四捨五入した結果
上部は処理前
中間部は偶数丸め
下部は四捨五入
問題なく一般的な四捨五入が行われた
df = pd.read_excel('./data.xlsx')
def normal_round(df):
df = df + 0.01
return df
print(df.round(1))
# 五捨五入(銀行丸め)
df.Point_2 = normal_round(df.Point_2)
df.Point_1 = normal_round(df.Point_1)
# 0.01を加える
print(df.round(1))
# 四捨五入
1桁目で四捨五入した結果
上部は処理前
中間部は偶数丸め
下部は四捨五入
問題なく一般的な四捨五入が行われた
まとめ
特に問題がなければ統計学的に良いとされる偶数丸めで良いが
業界によって値の決まりがあれば、一般的な四捨五入が必要であると思う
ここでは結果に影響しない程度の値を加えておくことによって意図せぬ五捨五入の発生を防いだ