Pandasのapply
とlambda
は、データ処理を柔軟かつ効率的に行うために非常によく使われる組み合わせです。
特に列ごとや行ごとの処理を行いたい場合に重宝します。
ここでは、基本の考え方 → 使い方のパターン → よくある応用例 → 注意点 の順で詳しく解説します。
目次
apply
とは?
apply
は、DataFrameやSeriesに対して関数を適用するメソッドです。
- Seriesの場合(1次元)
各要素に関数を適用します。 - DataFrameの場合(2次元)
行または列ごとに関数を適用します(axis
で指定)。
import pandas as pd
import numpy as np
# サンプルDataFrame
df = pd.DataFrame({
"A": [1, 2, 3],
"B": [10, 20, 30]
})
print("=== df ===")
print(df)
# サンプルSeries
s = pd.Series([1, 2, 3, 4], name="s")
print("\n=== s ===")
print(s)
# 列ごとの合計(デフォルト axis=0)
col_sum = df.apply(np.sum, axis=0)
print("\n=== 列ごとの合計 ===")
print(col_sum)
# 行ごとの合計(axis=1)
row_sum = df.apply(np.sum, axis=1)
print("\n=== 行ごとの合計 ===")
print(row_sum)
lambda
とは?
lambda
はPythonの無名関数で、短い処理を関数として書くときに使います。
# 通常の関数
def square(x):
return x ** 2
# lambdaで同等の処理
square_lambda = lambda x: x ** 2
print("\n=== square(5) vs square_lambda(5) ===")
print(square(5), square_lambda(5))
これをapply
と組み合わせることで、柔軟に処理を定義できるようになります。
apply
× lambda
の基本パターン
Seriesに使う場合
s = pd.Series([1, 2, 3, 4])
# 各要素を2乗
print(s.apply(lambda x: x ** 2))
DataFrameに使う場合(列や行に適用)
# 各値を2倍に
print(df.apply(lambda x: x * 2)) # 列方向(デフォルト axis=0)
# 各行ごとの合計を新しいSeriesとして返す
print(df.apply(lambda row: row["A"] + row["B"], axis=1))
よくある応用例
新しい列を作る
df["C"] = df.apply(lambda row: row["A"] + row["B"], axis=1)
print(df)
条件分岐
df["flag"] = df["A"].apply(lambda x: "大" if x > 2 else "小")
print(df)
文字列処理
names = pd.Series(["Alice", "Bob", "Charlie"])
print(names.apply(lambda x: x.lower()))
注意点とベストプラクティス
- 速度の問題
apply
+lambda
は便利ですが、行単位の処理をすると遅くなる場合があります。
可能であれば、PandasやNumPyのベクトル化処理を優先すると高速です。 例:# applyで書いた場合(遅い) df["C"] = df.apply(lambda row: row["A"] + row["B"], axis=1) # ベクトル演算で書いた場合(速い) df["C"] = df["A"] + df["B"]
- 可読性
lambda
を使いすぎるとコードが読みにくくなります。
複雑な処理はdef
で関数を定義してからapply
に渡すとよいです。def categorize(x): if x > 2: return "大" else: return "小" df["flag"] = df["A"].apply(categorize)
まとめ
apply
はPandasの各要素・列・行に関数を適用できる便利なメソッド。lambda
は短い処理をその場で書ける無名関数。- 両者を組み合わせると、条件分岐・文字列処理・新しい列の計算など柔軟な処理が可能。
- ただし速度面ではベクトル化処理が優先されるべきケースも多い。
以上、PythonのPandasのapplyとlambdaについてでした。
最後までお読みいただき、ありがとうございました。