【Python】Pandas DataFrame同士の四則演算まとめ(足し算・引き算・掛け算・割り算)

PandasのDataFrameでは、Excelのセル計算のように、DataFrame同士で直感的に四則演算(加減乗除)を行うことができます。

演算子(+, -, *, /)を使用すると、行ラベル(インデックス)と列ラベル(カラム)が一致する要素同士で自動的に計算が行われます。

本記事では、足し算だけでなく、引き算、掛け算、割り算を含めた包括的な演算方法について解説します。

目次

DataFrame演算の基本

DataFrame df1df2 がある場合、以下のように記述します。

  • 足し算: df1 + df2
  • 引き算: df1 - df2
  • 掛け算: df1 * df2 (行列積ではなく、要素ごとの積)
  • 割り算: df1 / df2

実装サンプルコード

ここでは、ある小売店の「販売実績」を分析するシナリオを想定します。 以下の4つのステップで計算を行います。

  1. 掛け算: 「販売数量」と「単価」から「売上金額」を算出
  2. 引き算: 「売上金額」から「原価」を引いて「粗利益」を算出
  3. 足し算: 「粗利益」に「特別リベート」を足して「修正後利益」を算出
  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() メソッドを使用します。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次