【applyの使い方】lambda関数でPandasを行・列毎に処理する方法 | Python

Python [文法解説]

apply関数を使用する際の基本構造

apply関数は、Pandas DataFrameを行・列ごとに一括処理する関数です。

基本構造は下記の通りでそこまで複雑ではないのですが、「行・列ごとに適用する関数」をどのように記述するかが馴染みがなくて、難しく感じる方が多いかと思います。

apply関数の基本構造

変数 . apply (行・列ごと適用する関数, axis=0 or 1)

解説

以降では、apply関数の引数毎に解説します。

  • 引数①:行・列ごとに適用する関数
  • 引数②:axis

引数①:行・列ごとに適用する関数

apply関数の基本構造

変数 . apply (行・列ごと適用する関数, axis=0 or 1)

ここが一番のポイントとなるのですが、行・列ごとに適用する関数を作成する必要があります。

関数の作成方法は

  • 「lambda」を使用する方法
  • 「def」を使用する方法

の2つがありますが、どちらを選択すればよいか疑問に思う人も多いかと思います。

「lambda」と「def」でそこまで大きな違いはないのですが、判断に迷った際は

  • 「lambda」の方が簡易的に関数を定義できる
  • apply関数を使用する場合、そこまで複雑な関数を定義する必要がないケースが多い

という理由からlambda」を使用しましょう。

1. サンプルソース(「lambda」で関数を定義する方法)

下記のDataFrame型の変数について、行毎に「col1」「col2」の和を計算する変数を定義します。

col1col2
row102
row213
# 行毎の和を計算(lambda)
add_fcn = lambda x: x['col1'] + x['col2']

簡単に構造を解説すると、下記のように「lambda」の後に変数(変数名は何でもok)を記述し、「:」の後に処理内容を記述します。

lambda 変数名: 処理内容

2. サンプルソース(「def」で関数を定義する方法)

先ほどと同様の関数を、「def」を使用して定義します。

# 行毎の和を計算(def)
def add_fcn(x):
    return x['col1'] + x['col2']

簡単に構造を解説すると、下記のように「def」の後に関数名・引数(何でもok)を記述し、その後にインデントを変えて処理内容と戻り値を記述します。

def 関数名( 引数 ):
処理内容
return 戻り値

比較してみると、やはりlambdaの方が簡易的に関数を定義できますね。
 ※複雑な処理を行う関数を定義したい場合は、「def」を使用することをおすすめします。

引数②:axis

apply関数の基本構造

変数 . apply (行・列ごと適用する関数, axis=0 or 1)

「axis」で、処理を行う方向を指定します。

具体的には、

  • axis=0:列ごとに処理を行う
  • axis=1:行ごとに処理を行う

となります。

デフォルトはaxis=0(列ごとに処理を行う)なので、行ごとに処理を行う場合はaxis=1を忘れずに設定しましょう。

使用例

ここからは、lambda関数を使用した場合のサンプルコードを紹介します。

ソースコードとその結果を確認して、理解を深めていきましょう!

使用例①:行ごとに処理

下記DataFrameについて、行ごとに「col1」と「col2」の和を計算するコードを記述します。

col1col2
row102
row213
# 使用例(1) : 行ごとに「col1」と「col2」の和を計算する 
# DataFrameを作成
df = pd.DataFrame(data={'col1': [0, 1], 'col2':[2, 3]}, index=['row1', 'row2'])

# 関数を定義
add_fcn = lambda x: x['col1'] + x['col2']

# apply関数を適用
ret_df = df.apply(add_fcn, axis=1)

# 結果出力
print(ret_df)

>>> row1    2
>>> row2    4
>>> dtype: int64

出力された値を確認すると、行ごとに「col1」と「col2」の和が計算されていることが分かりますね。
 ・0 + 2 = 2
 ・1 + 3 = 4

使用例②:列ごとに処理

# 使用例(2) : 列ごとに「row1」と「row2」の和を計算する 
# DataFrameを作成
df = pd.DataFrame(data={'col1': [0, 1], 'col2':[2, 3]}, index=['row1', 'row2'])

# 関数を定義
add_fcn = lambda x: x['col1'] + x['col2']

# apply関数を適用
ret_df = df.apply(add_fcn, axis=0)

# 結果出力
print(ret_df)

>>> col1    1
>>> col2    5
>>> dtype: int64

出力された値を確認すると、列ごとに「row1」と「row2」の和が計算されていることが分かりますね。
 ・0 + 1 = 1
 ・2 + 3 = 5

Pandas Serieseの要素毎に処理を行う方法

ここまでは、Pandas DataFrameを行・列ごとに処理を行う方法を解説してきました。

こちらはapply関数を使用することで対応できるのですが、関連する関数に「map関数」というものがあります。

これは、Pandas Seriesを要素ごとに一括処理してくれる関数です。

Pandas Seriesとは、下記のようにDataFrame型変数の列名を指定した際の型です。

DataFrame型変数 [‘カラム名’]

map変数の基本構造(変数がPandas Seriesの場合)
変数 . map (要素毎に適用する関数)

map関数については、「【mapの使い方】lambda関数でPandas・リストを要素毎に処理する方法|Python」で詳細解説しているので、map関数について知りたい方は是非読んでみてください!

forループを使用する代わりにapply関数・map関数を使用することで、処理が速いコードを書けるようになりますよ。

コメント

タイトルとURLをコピーしました