0
1

More than 1 year has passed since last update.

[python] pandasの四捨五入と五捨五入

Last updated at Posted at 2022-10-19

はじめに

データでは有効数字の概念がとても大事である
特に誰かにデータを見せる時は桁数を可読性のためにも揃える必要がある
ここでは基本的な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)

image.png

小数点第1位になるように五捨五入(偶数丸め)

df = df.round(1)
print(df)

image.png

0.05 -> 0.00
0.25 -> 0.20
このようにpandasではなるべく偶数になるように五捨五入が行われる
我々が高校までの教科で勉強したような四捨五入とは異なるが、五捨五入のほうが統計学的には良いとされるらしい

小数点第0位(整数)になるように五捨五入(偶数丸め)

df = df.round(0)
print(df)

image.png

1桁(整数)で五捨五入(偶数丸め)

df = df.round(-1)
print(df)

image.png
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))

image.png

小数点第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))
# 四捨五入

image.png
1桁目で四捨五入した結果
上部は処理前
中間部は偶数丸め
下部は四捨五入

問題なく一般的な四捨五入が行われた

まとめ

特に問題がなければ統計学的に良いとされる偶数丸めで良いが
業界によって値の決まりがあれば、一般的な四捨五入が必要であると思う
ここでは結果に影響しない程度の値を加えておくことによって意図せぬ五捨五入の発生を防いだ

0
1
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
0
1