配列、Pandas、Numpyを四捨五入、切り上げ、切り捨て[Python]

本記事では、Pythonで四捨五入、切り上げ、切り捨てする方法を、「変数」、「配列」、「numpyの配列」、「PandasのDataFrame」の各ケースごとに紹介します。

こんな人におすすめ

  • Pythonの変数を四捨五入、切り上げ、切り捨てしたい
  • Pythonの配列を一気に四捨五入、切り上げ、切り捨てしたい
  • numpyの配列を一気に四捨五入、切り上げ、切り捨てしたい
  • pandaのDataFrameを一気に四捨五入、切り上げ、切り捨てしたい

主なライブラリ

  • decimal
  • math
  • pandas
  • numpy

本ページで使用するライブラリをインポートするときは以下のコードを使用します。

import math
from pandas as pd
from numpy as np
from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_UP, ROUND_DOWN, ROUND_UP

Python変数(四捨五入)

decimalライブラリのDecimal.quantizeを使用して、Pythonの変数を四捨五入します。
引数は以下のように設定します。
Decimalの引数  :四捨五入したい変数を文字列型で設定。
quantizeの第1引数:四捨五入後の小数点の桁数を「Decimal(文字列型)」の形で設定。
quantizeの第2引数:「rounding=ROUND_HALF_UP」を設定。

i = 1.234

print(Decimal(str(i)).quantize(Decimal('1'), rounding=ROUND_HALF_UP))
# ⇒ 1

print(Decimal(str(i)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP))
# ⇒ 1.2

print(Decimal(str(i)).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP))
# ⇒ 1.23

Python変数の四捨五入では、round関数が良く使われます。round関数を利用する方が簡単ですが、正確な四捨五入ができないケースがあります。
round関数のサンプルコードも下記に載せておきますが、正確な結果が必要な時はdecimal関数を使いましょう。

# 正しい四捨五入の結果は5だが、round関数は「偶数丸め」をしているため、4が返ってくる。
i = 4.5
print(round(i))
# ⇒ 4

# 正しい結果が返ってくる
j = 5.5
print(round(j))
# ⇒ 6

Python変数(切り上げ)

math.ceil関数を使用して、Pythonの変数を切り上げします。

i = 1.2345

# 小数点第1位を切り上げる
print(math.ceil(i))
# ⇒ 2

# 小数点第2位を切り上げる
print(math.ceil(i * 10) / 10)
# ⇒ 1.3

decimal関数を使った切り上げも可能です。

i = 1.2345

# 小数点第1位を切り上げる
print(Decimal(str(i)).quantize(Decimal('1'), rounding=ROUND_UP))
# ⇒ 2

# 小数点第2位を切り上げる
print(Decimal(str(i)).quantize(Decimal('.1'), rounding=ROUND_UP))
# ⇒ 1.3

Python変数(切り捨て)

math.floor関数を使用して、Pythonの変数を切り捨てします。

i = 1.2345

# 小数点第1位を切り捨てる
print(math.floor(i))
# ⇒ 1

# 小数点第2位を切り捨てる
print(math.floor(i * 10) / 10)
# ⇒ 1.2

decimal関数を使った切り捨ても可能です。

i = 1.2345

# 小数点第1位を切り捨てる
print(Decimal(str(i)).quantize(Decimal('1'), rounding=ROUND_DOWN))
# ⇒ 1

# 小数点第2位を切り捨てる
print(Decimal(str(i)).quantize(Decimal('.1'), rounding=ROUND_DOWN))
# ⇒ 1.2

Python配列(四捨五入)

Pythonの配列を四捨五入するときは、配列内の数値を直接四捨五入する関数はありません。

繰り返し処理を使って四捨五入を行いましょう。

print([Decimal(str(i)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP) for i in list1])
# ⇒ [1.2, 3.5, 5.7]

print([round(i, 1) for i in list1])
# ⇒ [1.2, 3.5, 5.7]

Decimalを利用した四捨五入処理は実行すると、[Decimal(‘1.2’) Decimal(‘3.5’) Decimal(‘5.7’)]と表記されますが、[1.2, 3.5, 5.7]と同じように扱えます。

Python配列(切り上げ)

四捨五入と同様に、配列内の数値を直接切り上げする関数はないため、繰り返し処理を使って切り上げを行います。

print([math.ceil(i) for i in list1])
# ⇒ [2, 4, 6]

Python配列(切り捨て)

四捨五入と同様に、配列内の数値を直接切り捨てする関数はないため、繰り返し処理を使って切り捨てを行います。

print([math.floor(i) for i in list1])
# ⇒ [1, 3, 5]

numpy配列(四捨五入)

numpyの配列については、偶数丸めを行うnp.round関数はありますが、厳密に四捨五入する関数は準備されていません。厳密に四捨五入したい場合には、関数を作成する必要があります。
偶数丸めで問題ない場合は、np.round関数が利用できます。

list2 = np.array([[1.234, 3.456, 5.678],
                       [5.432, 6.543, 8.765]])

# decimalを利用する場合
def func_ROUND_HALF_UP(x):
   return Decimal(str(x)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)

print(np.vectorize(func_ROUND_HALF_UP)(list2))
# [[Decimal('1.2') Decimal('3.5') Decimal('5.7')]
#   [Decimal('5.4') Decimal('6.5') Decimal('8.8')]]

# roundを利用する場合
print(np.round(list2, 1))
# [[1.2 3.5 5.7]
#  [5.4 6.5 8.8]]

Decimalを利用した四捨五入処理は実行すると、[Decimal(‘1.2’) Decimal(‘3.5’) Decimal(‘5.7’)] [Decimal(‘5.4’) Decimal(‘6.5’) Decimal(‘8.8’)]と表記されますが、[[1.2, 3.5, 5.7] [5.4,6.5,8.8]]と同じように扱えます。

numpy配列(切り上げ)

np.ceil関数を利用して、numpy配列の切り上げを行うことができます。

list2 = np.array([[1.234, 3.456, 5.678],
                      [5.432, 6.543, 8.765]])

print(np.ceil(list2))
# [[2. 4. 6.]
#  [6. 7. 9.]]

numpy配列(切り捨て)

np.floor関数を利用して、numpy配列の切り捨てを行うことができます。

list2 = np.array([[1.234, 3.456, 5.678],
                      [5.432, 6.543, 8.765]])

print(np.floor(list2))
# [[1. 3. 5.]
#  [5. 6. 8.]]

pandasのDataFrame(四捨五入)

pandasのDataFrameにもround関数が準備されていますが、こちらも偶数丸めの処理になります。
厳密に四捨五入したい場合は、自作の関数を使いましょう。
DataFrameのagg関数を使うと、自作の関数を適用できます。

df = pd.DataFrame({'a':[1.23, 2.34, 3.45], 'b':[4.4, 4.5, 4.6]})
#       a    b
# 0  1.23  4.4
# 1  2.34  4.5
# 2  3.45  4.6

def func_ROUND_HALF_UP(list1):
    return [Decimal(str(i)).quantize(Decimal('1'), rounding=ROUND_HALF_UP) for i in list1]

print(df.agg(func_ROUND_HALF_UP))
#    a  b
# 0  1  4
# 1  2  5
# 2  3  5

print(df.round())
#      a    b
# 0  1.0  4.0
# 1  2.0  4.0 ⇒ 偶数丸め
# 2  3.0  5.0

pandasのDataFrame(切り上げ)

pandasのDataFrameで切り上げを行う際はDataFrameのagg関数を使い、np.ceil関数を適用します。

print(df.agg(np.ceil))
#      a    b
# 0  2.0  5.0
# 1  3.0  5.0
# 2  4.0  5.0

pandasのDataFrame(切り捨て)

pandasのDataFrameで切り捨てを行う際はDataFrameのagg関数を使い、np.floor関数を適用します。

print(df.agg(np.floor))
#      a    b
# 0  1.0  4.0
# 1  2.0  4.0
# 2  3.0  4.0