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を使って複数列を参照して計算する方法についてでした。
最後までお読みいただき、ありがとうございました。