HOWTO · Pandas
Pandas DataFrame のすべての行に関数を適用する
このチュートリアルでは、Pandas apply 関数を DataFrame のすべての行に適用する方法と、ラムダ、numpy、ユーザー定義関数を各行に使用するなど、さまざまな関数を引数として適用する方法を示します。
このページの内容
DataFrame.apply() に axis=1 を指定すると、各行を callable に渡せます。callable が変換した行を返すと、apply() はそれらをまとめて DataFrame を作成します。このガイドでは、行方向を指定する方法、lambda、NumPy 関数、追加引数の有無によるユーザー定義関数の使い方を紹介します。
Pandas の apply() 関数の基本構文
基本形は dataframe.apply(function, axis=1, args=()) です。callable に行を渡すには axis=1 を指定します。既定値は axis=0 で、この場合は列が渡されます。行ごとに適用すると、callable は列名をインデックスに持つ Series を受け取り、その戻り値によって結果の形が決まります。各行でスカラーを返すと Series になり、ラベルが一貫した Series を返すと DataFrame になります。
args を使うと、行の後に追加の位置引数を渡せます。すべての行で共通する値をカスタム callable に渡す場合に便利です。パラメーターの詳細は DataFrame.apply() を参照してください。
Pandas の DataFrame の各行に lambda 関数を適用する
短い変換には lambda が便利です。この例では行内の各値に 10 を加え、同じ列を持つ DataFrame を返します。処理が長くなる場合は、名前付き関数にすると読みやすく、再利用もしやすくなります。
次の例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
import pandas as pd
dataframe = pd.DataFrame([(1, 34, 23), (11, 31, 11)], columns=list("ABC"))
result = dataframe.apply(lambda row: row + 10, axis=1)
print(result)
A B C
0 11 44 33
1 21 41 21
Pandas の DataFrame の各行に NumPy 関数を適用する
行内の各値に対して動作する NumPy の callable は、そのまま渡せます。ここでは np.sqrt が各数値セルを変換し、apply() が変換後の行をまとめます。平方根は 0 以上の数値に適しています。データに別の型が含まれる場合や、扱う値に応じた条件がある場合は、別の演算を選んでください。
次の例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
import numpy as np
import pandas as pd
dataframe = pd.DataFrame([(4, 9, 16), (25, 36, 49)], columns=list("ABC"))
result = dataframe.apply(np.sqrt, axis=1)
print(result)
A B C
0 2.0 3.0 4.0
1 5.0 6.0 7.0
Pandas の DataFrame の各行に引数付きでユーザー定義関数を適用する
短い式では足りない場合は、行の変換処理を関数として定義します。この例では row が最初の引数で、args を通じてその後に 2 を渡します。関数は各値を 2 倍にします。args には位置引数のタプルを指定するため、追加する値が 1 つだけの場合も (2,) と書きます。
次の例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
import pandas as pd
def multiply_row(row, factor):
return row * factor
dataframe = pd.DataFrame([(2, 3, 4), (3, 5, 10)], columns=list("ABC"))
result = dataframe.apply(multiply_row, axis=1, args=(2,))
print(result)
A B C
0 4 6 8
1 6 10 20
Pandas の DataFrame の各行に引数なしでユーザー定義関数を適用する
全行共通の追加パラメーターが不要なら、行だけを引数に取る callable を定義し、そのまま渡します。この例では行の各値に 4 を掛けます。戻される行のラベルは維持されるため、結果は元の列を持つ DataFrame になります。
次の例を実行します。
このセクションのコードと表示されるラベルや出力は英語のままです。
import pandas as pd
def multiply_by_four(row):
return row * 4
dataframe = pd.DataFrame([(2, 3, 4), (3, 5, 10)], columns=list("ABC"))
result = dataframe.apply(multiply_by_four, axis=1)
print(result)
A B C
0 8 12 16
1 12 20 40
apply() は、行全体を扱う callable が必要な処理に使います。単純な列単位の算術演算なら、直接ベクトル化した式のほうが明快で、行ごとの Python 呼び出しも避けられます。