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 呼び出しも避けられます。