PandasのDataFrameでは、Excelのセル計算のように、DataFrame同士で直感的に四則演算(加減乗除)を行うことができます。
演算子(+, -, *, /)を使用すると、行ラベル(インデックス)と列ラベル(カラム)が一致する要素同士で自動的に計算が行われます。
本記事では、足し算だけでなく、引き算、掛け算、割り算を含めた包括的な演算方法について解説します。
目次
DataFrame演算の基本
DataFrame df1 と df2 がある場合、以下のように記述します。
- 足し算:
df1 + df2 - 引き算:
df1 - df2 - 掛け算:
df1 * df2(行列積ではなく、要素ごとの積) - 割り算:
df1 / df2
実装サンプルコード
ここでは、ある小売店の「販売実績」を分析するシナリオを想定します。 以下の4つのステップで計算を行います。
- 掛け算: 「販売数量」と「単価」から「売上金額」を算出
- 引き算: 「売上金額」から「原価」を引いて「粗利益」を算出
- 足し算: 「粗利益」に「特別リベート」を足して「修正後利益」を算出
- 割り算: 「売上金額」を「目標売上」で割って「達成率」を算出
import pandas as pd
def demonstrate_dataframe_operations():
"""
Pandas DataFrame同士の四則演算(加減乗除)を実演する関数
"""
# ---------------------------------------------------------
# データの準備: 商品(行) × 地域(列) のデータフレームを作成
# ---------------------------------------------------------
products = ["Product_A", "Product_B", "Product_C"]
regions = ["East_Region", "West_Region"]
# 1. 販売数量データ (Quantity)
df_quantity = pd.DataFrame(
[[100, 150], [80, 90], [200, 220]],
index=products, columns=regions
)
# 2. 単価データ (Unit Price)
# 地域ごとに単価が異なると仮定
df_price = pd.DataFrame(
[[500, 520], [1200, 1150], [300, 300]],
index=products, columns=regions
)
print("--- 1. 販売数量 (Quantity) ---")
print(df_quantity)
print("\n--- 2. 単価 (Unit Price) ---")
print(df_price)
# ---------------------------------------------------------
# 【掛け算 (*)】: 数量 × 単価 = 売上金額
# ---------------------------------------------------------
# 要素ごとの積(Element-wise product)が計算されます
df_sales = df_quantity * df_price
print("\n=== [掛け算] 売上金額 (Quantity * Price) ===")
print(df_sales)
# ---------------------------------------------------------
# 【引き算 (-)】: 売上金額 - 原価 = 粗利益
# ---------------------------------------------------------
# 原価データ (Cost) を作成
# ここでは売上の約70%程度の数値をダミーで用意
df_cost = pd.DataFrame(
[[35000, 54000], [67000, 72000], [42000, 46000]],
index=products, columns=regions
)
df_gross_profit = df_sales - df_cost
print("\n=== [引き算] 粗利益 (Sales - Cost) ===")
print(df_gross_profit)
# ---------------------------------------------------------
# 【足し算 (+)】: 粗利益 + リベート = 修正後利益
# ---------------------------------------------------------
# 本部からのリベート(報奨金)データ
df_rebate = pd.DataFrame(
[[1000, 2000], [500, 500], [3000, 3000]],
index=products, columns=regions
)
df_final_profit = df_gross_profit + df_rebate
print("\n=== [足し算] 修正後利益 (Gross Profit + Rebate) ===")
print(df_final_profit)
# ---------------------------------------------------------
# 【割り算 (/)】: 売上金額 / 目標金額 = 達成率
# ---------------------------------------------------------
# 目標売上データ (Target)
df_target = pd.DataFrame(
[[60000, 80000], [100000, 100000], [50000, 70000]],
index=products, columns=regions
)
# 達成率を計算 (結果は小数)
df_achievement_rate = df_sales / df_target
print("\n=== [割り算] 目標達成率 (Sales / Target) ===")
# 見やすくするために小数点以下2桁に丸めて表示
print(df_achievement_rate.round(2))
if __name__ == "__main__":
demonstrate_dataframe_operations()
実行結果
--- 1. 販売数量 (Quantity) ---
East_Region West_Region
Product_A 100 150
Product_B 80 90
Product_C 200 220
--- 2. 単価 (Unit Price) ---
East_Region West_Region
Product_A 500 520
Product_B 1200 1150
Product_C 300 300
=== [掛け算] 売上金額 (Quantity * Price) ===
East_Region West_Region
Product_A 50000 78000
Product_B 96000 103500
Product_C 60000 66000
=== [引き算] 粗利益 (Sales - Cost) ===
East_Region West_Region
Product_A 15000 24000
Product_B 29000 31500
Product_C 18000 20000
=== [足し算] 修正後利益 (Gross Profit + Rebate) ===
East_Region West_Region
Product_A 16000 26000
Product_B 29500 32000
Product_C 21000 23000
=== [割り算] 目標達成率 (Sales / Target) ===
East_Region West_Region
Product_A 0.83 0.98
Product_B 0.96 1.04
Product_C 1.20 0.94
注意点
- インデックスの不一致: 計算する2つのDataFrameでインデックスやカラム名が異なる場合、Pandasはそれらを自動的に結合(外部結合のような挙動)し、片方にしかデータがない箇所は
NaN(欠損値)となります。 - ゼロ除算: 割り算を行う際、分母に
0が含まれていると、結果はinf(無限大)またはNaNになります。 - 行列積: 行列としての積(内積)を計算したい場合は、演算子
*ではなくdf.dot()メソッドを使用します。
