pandasのapply関数とは?
Python
のデータ分析ライブラリであるpandasは、データ処理を効率的に行うための豊富なツールを提供しています。その中でもapply
関数は、データフレームやシリーズに対して柔軟に関数を適用できる強力なメソッドです。apply
を使うことで、カスタムの関数をデータに対して行ごとや列ごとに適用でき、さまざまなデータ操作や変換を行うことが可能です。
apply
は、データの前処理やクリーニング、特定の変換を行う際に非常に便利であり、pandasを使用する際に頻繁に使われる関数の一つです。
apply関数の基本的な使い方
基本的な構文
DataFrame.apply(func, axis=0, raw=False, result_type=None, args=(), kwds)
- func: 適用する関数。ユーザー定義関数やラムダ式が使えます。
- axis: 関数を適用する方向。
0
は列ごと、1
は行ごとに適用します。 - raw: Trueにすると、シリーズではなくNumPy配列が関数に渡されます(デフォルトはFalse)。
- result_type:
expand
、reduce
、broadcast
のいずれかを指定して、結果の形式を制御します。 - args: 関数に渡す追加の位置引数。
- kwds: 追加のキーワード引数。
使用例 - 列に関数を適用する
まず、pandasを使って簡単なデータフレームを作成し、apply
関数を使って特定の列に関数を適用する例を見てみましょう。
import pandas as pd
# データフレームの作成
df = pd.DataFrame({
'A': [1, 2, 3, 4],
'B': [10, 20, 30, 40]
})
# 関数を列ごとに適用 (平方を計算)
df['A_squared'] = df['A'].apply(lambda x: x 2)
print(df)
出力結果:
A B A_squared
0 1 10 1
1 2 20 4
2 3 30 9
3 4 40 16
この例では、apply
を使って列A
に対してlambda x: x 2
というラムダ式を適用し、新しい列A_squared
に結果を保存しています。このように、apply
を使えば任意の計算や変換を簡単に列ごとに適用できます。
行に関数を適用する
次に、データフレームの行ごとに関数を適用する例です。
# 行ごとに関数を適用 (列AとBの合計を計算)
df['A_B_sum'] = df.apply(lambda row: row['A'] + row['B'], axis=1)
print(df)
出力結果:
A B A_squared A_B_sum
0 1 10 1 11
1 2 20 4 22
2 3 30 9 33
3 4 40 16 44
この例では、apply
をaxis=1
として設定し、行ごとに処理を適用しています。行全体に対して操作を行いたい場合は、axis=1
を指定するのがポイントです。
pandasのapply関数とmap関数の違い
pandasにはapply
関数と似たような機能を持つmap
関数がありますが、用途が異なります。apply
はデータフレーム全体や行、列に対して関数を適用するのに対し、map
はシリーズに対して個々の要素に対して変換や置換を行うために使われます。
map関数の例
# データフレームの列に対して map を適用
df['A_mapped'] = df['A'].map({1: 'one', 2: 'two', 3: 'three', 4: 'four'})
print(df)
出力結果:
A B A_squared A_B_sum A_mapped
0 1 10 1 11 one
1 2 20 4 22 two
2 3 30 9 33 three
3 4 40 16 44 four
map
は、特定の変換を簡単に行う場合に便利ですが、apply
のように複雑な処理を行う場合には使いにくいことがあります。
apply関数の応用例
条件に基づいて値を変換する
データフレームの値を条件に基づいて変換する際にもapply
は便利です。例えば、特定の条件を満たす場合にフラグを設定する例を見てみましょう。
# 列Aの値が2以上なら 'high'、それ以外は 'low' とする
df['A_category'] = df['A'].apply(lambda x: 'high' if x >= 2 else 'low')
print(df)
出力結果:
A B A_squared A_B_sum A_mapped A_category
0 1 10 1 11 one low
1 2 20 4 22 two high
2 3 30 9 33 three high
3 4 40 16 44 four high
このように、条件分岐を含んだ処理を簡単に実装できます。
複数の列にまたがる処理
複数の列にまたがって処理を行うこともapply
を使えば簡単です。例えば、複数の列を組み合わせて新しい値を生成する場合です。
# 列AとBの比率を計算
df['A_B_ratio'] = df.apply(lambda row: row['A'] / row['B'], axis=1)
print(df)
出力結果:
A B A_squared A_B_sum A_mapped A_category A
_B_ratio
0 1 10 1 11 one low 0.1
1 2 20 4 22 two high 0.1
2 3 30 9 33 three high 0.1
3 4 40 16 44 four high 0.1
この例では、apply
で行ごとにA
列とB
列の比率を計算し、新しい列にその値を追加しています。
apply関数のパフォーマンスと注意点
apply
は柔軟で強力なメソッドですが、処理が行や列ごとに実行されるため、非常に大きなデータセットに対して使うとパフォーマンスが低下することがあります。大量のデータに対して複雑な処理を行う場合は、pandasの他のメソッドやNumPyのベクトル化された操作を検討することが推奨されます。
例えば、NumPyを使ったベクトル化された操作は、forループやapply
を使うよりも高速です。
import numpy as np
# NumPyを使って列AとBの比率を高速に計算
df['A_B_ratio_fast'] = np.divide(df['A'], df['B'])
print(df)
まとめ
pandasのapply
関数は、データフレームやシリーズに対して任意の関数を柔軟に適用できる非常に便利なメソッドです。行や列ごとに処理を行う際に特に有用で、カスタム関数やラムダ式を使って高度なデータ変換や操作が可能です。簡単な前処理から複雑な計算まで、多様なシチュエーションで役立つこの関数を使いこなして、効率的なデータ分析を行いましょう。
ただし、大規模なデータセットではパフォーマンスに注意が必要です。ベクトル化されたNumPy操作や他のpandasメソッドと組み合わせて使用することで、効率的な処理を実現できます。