【Pandas数値処理】四捨五入・偶数丸め・切り捨て・切り上げを自在に操る方法 🔢


 

データ分析において、数値データの丸め処理は頻繁に登場する基本的な操作です。例えば、計算結果を小数点以下第2位で丸めたり、金融データを特定の桁数で切り捨てたり、逆に切り上げたりするニーズがあります。特に、一般的な四捨五入だけでなく、統計的な文脈で重要な**偶数丸め(銀行型丸め)**を正確に適用する必要がある場合もあります。

Pandasは、DataFrameやSeriesの数値データに対して、これらの多様な丸め処理を効率的に行うための機能を提供しています。この記事では、Pandasを使って四捨五入、偶数丸め、切り捨て、切り上げといった丸め処理を自在に行うための主要なテクニックを、短いサンプルコードと丁寧な解説を交えてご紹介します。


 

数値の丸め処理とは?なぜ重要なのか?

 

数値の丸め処理とは、ある数値を指定された桁数や単位で近似することです。

なぜ数値の丸め処理が必要なのでしょうか?

  • 表示の簡潔化: 数値データを人間が理解しやすいように、不要な桁数を削減します。

  • 精度管理: 計算の途中で発生する微細な誤差を調整し、特定の精度要件を満たします。

  • 統計的正確性: 特に「.5」の丸め方において、偶数丸めを使用することで、丸め誤差によるデータの偏りを最小限に抑え、統計的な分析の精度を高めます。

  • データの一貫性: 異なるソースから取得したデータの桁数を統一し、比較を容易にします。


 

1. 四捨五入・偶数丸め: round()メソッド

 

Pandasのround()メソッドは、NumPyのround()関数と同じく、デフォルトで**偶数丸め(nearest even rounding)**を行います。これは、丸めたい桁の次の桁が5の場合、偶数の方に丸めるというルールです。例えば、2.52に、3.54に丸められます。

 

小数点以下を丸める

 

decimals引数に丸めたい小数点以下の桁数を指定します。

Python
 
import pandas as pd
import numpy as np

# サンプルDataFrameの作成
df = pd.DataFrame({
    '値A': [1.234, 5.678, 9.125, 4.500],
    '値B': [2.5, 3.5, 6.5, 7.5] # 偶数丸めのテスト用
})
print("オリジナルDataFrame:\n", df)

# 小数点以下2桁で丸める (偶数丸め)
df_rounded_2dec = df.round(decimals=2)
print("\n小数点以下2桁で偶数丸め後:\n", df_rounded_2dec)

解説:

  1. df.round(decimals=2): DataFrame全体の数値列を小数点以下2桁で丸めます。

  2. 値B列に注目してください。2.52に、3.54に、6.56に、7.58に丸められています。これが偶数丸めの特徴です。

 

整数部分を丸める

 

decimals引数に負の値を指定することで、小数点以上(整数部分)を丸めることができます。

Python
 
# 10の位で丸める (decimals=-1)
# 例: 123 -> 120, 125 -> 120, 135 -> 140
df_rounded_tens = pd.DataFrame({'値C': [123, 125, 135, 248]})
df_rounded_tens_result = df_rounded_tens.round(decimals=-1)
print("\n10の位で偶数丸め後:\n", df_rounded_tens_result)

解説:

decimals=-1と指定すると、10の位で丸められます。125は120に、135は140に丸められていることから、ここでも偶数丸めが適用されていることがわかります。


 

2. 切り捨て: numpy.floor()

 

数値を常に小さい方へ丸める「切り捨て」は、PandasではNumPyの関数(np.floor)をSeriesやDataFrameのapply()メソッドで適用するか、直接Seriesにnp.floorを渡すことで実現できます。

Python
 
# 切り捨て (常に小さい方へ丸める)
# 1.23 -> 1.00, -1.78 -> -2.00
df_floor = df.copy() # 元のDataFrameをコピー
df_floor['値A'] = np.floor(df_floor['値A'])
df_floor['値B'] = np.floor(df_floor['値B']) # 2.5 -> 2.0, 3.5 -> 3.0 など
print("\n切り捨て後 (np.floor):\n", df_floor)

# マイナスの値で確認
df_neg = pd.DataFrame({'値D': [1.7, -1.7, 2.0, -2.0]})
df_neg['値D_floor'] = np.floor(df_neg['値D'])
print("\nマイナスの値の切り捨て確認:\n", df_neg)

解説:

np.floor()は、与えられた数値以下の最大の整数を返します。したがって、正の数では小数点以下が切り捨てられ、負の数では絶対値が大きくなる方向に丸められます(例: -1.7は-2.0)。


 

3. 切り上げ: numpy.ceil()

 

数値を常に大きい方へ丸める「切り上げ」は、NumPyのnp.ceil関数を使用します。

Python
 
# 切り上げ (常に大きい方へ丸める)
# 1.23 -> 2.00, -1.78 -> -1.00
df_ceil = df.copy() # 元のDataFrameをコピー
df_ceil['値A'] = np.ceil(df_ceil['値A'])
df_ceil['値B'] = np.ceil(df_ceil['値B']) # 2.5 -> 3.0, 3.5 -> 4.0 など
print("\n切り上げ後 (np.ceil):\n", df_ceil)

# マイナスの値で確認
df_neg['値D_ceil'] = np.ceil(df_neg['値D'])
print("\nマイナスの値の切り上げ確認:\n", df_neg)

解説:

np.ceil()は、与えられた数値以上の最小の整数を返します。正の数では小数点以下が切り上げられ、負の数では絶対値が小さくなる方向に丸められます(例: -1.7は-1.0)。


 

4. ゼロ方向への丸め(truncate):numpy.trunc()

 

np.trunc()は、数値をゼロ方向(原点方向)に丸めます。これは、正の数では切り捨て(floor)、負の数では切り上げ(ceil)と同じ動作になります。

Python
 
# ゼロ方向への丸め
df_trunc = pd.DataFrame({'値E': [1.7, -1.7, 2.0, -2.0]})
df_trunc['値E_trunc'] = np.trunc(df_trunc['値E'])
print("\nゼロ方向への丸め後 (np.trunc):\n", df_trunc)

解説:

  • 1.71.0に(切り捨て)

  • -1.7は-1.0に(切り上げ)

    このように、常に絶対値が小さくなる方向に丸められます。


 

まとめ

 

PandasとNumPyを組み合わせることで、数値データに対して様々な丸め処理を柔軟に適用できます。

  • df.round(decimals=N): 最も一般的な丸め方で、デフォルトで偶数丸めを実行します。指定したN桁で丸められます。

  • np.floor(series/df): 数値を常に切り捨て(小さい整数へ)。

  • np.ceil(series/df): 数値を常に切り上げ(大きい整数へ)。

  • np.trunc(series/df): 数値を常にゼロ方向へ丸める。

これらの関数を適切に使い分けることで、データの表示を簡潔にしたり、計算の精度を管理したり、統計的な分析の前提を満たしたりすることができます。特に、.5の扱いに関してはround()が偶数丸めを行うことを理解し、必要に応じてnp.floornp.ceilを使い分けることが重要です。あなたのデータ分析の精度と効率を、これらの丸め処理テクニックでさらに向上させましょう!