PythonのPandasでapplyを使って複数列を参照して計算する方法

Python,イメージ

AI実装検定のご案内

pandas.DataFrame.apply を使って 複数列を同時に参照して計算する方法 について、基本から応用まで詳しく説明します。

目次

基本構文のおさらい

apply行ごと (axis=1) または 列ごと (axis=0) に関数を適用できます。

複数列を使いたい場合は、axis=1 を指定して行単位で処理するのがポイントです。

import pandas as pd

# サンプルデータ作成
df = pd.DataFrame({
    "A": [1, 2, 3],
    "B": [10, 20, 30],
    "C": [100, 200, 300]
})

print(df)

複数列を参照して計算する基本例

例えば、A 列と B 列を足し算して新しい列 sum_AB を作りたい場合

# A列とB列を足し算して新しい列 sum_AB を作成
df["sum_AB"] = df.apply(lambda row: row["A"] + row["B"], axis=1)

print(df)

ポイントは

  • row は各行を表す Seriesオブジェクト
  • row["A"]row.B のように列を参照できる
  • axis=1 がないと列ごとに適用されてしまう

複雑な計算の例

例えば、「A * 2 + B - C/10」のように複数列を組み合わせる場合

# A * 2 + B - C/10 の計算を custom_calc 列に追加
df["custom_calc"] = df.apply(lambda row: row["A"]*2 + row["B"] - row["C"]/10, axis=1)

print(df)

独自関数を定義して使う

ラムダ関数が複雑になりすぎる場合は、別途関数を定義して渡すこともできます。

# 独自関数を定義
def my_calc(row):
    return (row["A"] + row["B"]) * row["C"]

# applyで呼び出し
df["custom"] = df.apply(my_calc, axis=1)

print(df)

引数を追加する場合

例えば、外部からパラメータを与えたい場合

# 外部から引数を渡す例
def add_with_weight(row, weight):
    return row["A"] + row["B"] * weight

df["weighted"] = df.apply(add_with_weight, axis=1, weight=2)

print(df)

複数列をまとめて返す(DataFrame化)

1つの関数から複数の値を返し、新しい列をまとめて追加することも可能です。

# 複数の値を返す関数
def calc_multi(row):
    return pd.Series({
        "sum_AB": row["A"] + row["B"],
        "diff_AC": row["A"] - row["C"]
    })

df[["sum_AB", "diff_AC"]] = df.apply(calc_multi, axis=1)

print(df)

apply より効率的な書き方

apply は柔軟ですが遅い場合があります。シンプルな計算なら ベクトル演算 で直接書いた方が速いです。

# applyを使わずに高速化する例
df["sum_AB"] = df["A"] + df["B"]
df["custom_calc"] = df["A"]*2 + df["B"] - df["C"]/10

print(df)
  • 小規模データ → apply でOK
  • 大規模データ → ベクトル演算を優先
    (速度が数十倍違うこともあります)

まとめ

  • df.apply(lambda row: ..., axis=1) で行ごとに複数列を参照できる
  • 複雑な計算は関数を定義して使うと可読性が上がる
  • 複数の列を返したい場合は pd.Series を返す
  • 高速化を意識するならベクトル演算を優先

以上、Pandasでapplyを使って複数列を参照して計算する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次