Pandas DataFrame で複数の列に関数を適用する

この記事では、Pandas の DataFrame で複数の列に関数を適用する方法を紹介します。全てのコード例で以下と同じ DataFrame を使用します。

import pandas as pd
import numpy as np

df = pd.DataFrame([
                    [5,6,7,8],
                    [1,9,12,14],
                    [4,8,10,6]
                    ],
                  columns = ['a','b','c','d'])

出力:

   a  b   c   d
0  5  6   7   8
1  1  9  12  14
2  4  8  10   6

apply() を使用して、Pandas の列に関数を適用する

apply() メソッドを使用すると、DataFrame 全体に関数を適用することができます。パラメータ axis には、行に対しては 0、列に対しては 1 を設定します。

以下の例では、先ほど定義した関数を使用してサンプル DataFrame の値をインクリメントします。

import pandas as pd
import numpy as np

df = pd.DataFrame([
                    [5,6,7,8],
                    [1,9,12,14],
                    [4,8,10,6]
                    ],
                  columns = ['a','b','c','d'])

def x(a):
    return a + 1 

df_new  = df.apply(x, axis = 1)

print("The original dataframe:")
print(df)
print("The new dataframe:")
print(df_new)

出力:

The original dataframe:
   a  b   c   d
0  5  6   7   8
1  1  9  12  14
2  4  8  10   6
The new dataframe:
   a   b   c   d
0  6   7   8   9
1  2  10  13  15
2  5   9  11   7

以下に示すように、複数の列に関数を適用することもできます。

import pandas as pd
import numpy as np

df = pd.DataFrame([
                    [5,6,7,8],
                    [1,9,12,14],
                    [4,8,10,6]
                    ],
                  columns = ['a','b','c','d'])

print("The original dataframe:")
print(df)

def func(x):
    return x[0] + x[1]

df['e']  = df.apply(func, axis = 1)

print("The new dataframe:")
print(df)

出力:

The original dataframe:
   a  b   c   d
0  5  6   7   8
1  1  9  12  14
2  4  8  10   6
The new dataframe:
   a  b   c   d   e
0  5  6   7   8  11
1  1  9  12  14  10
2  4  8  10   6  12

新たに追加された e 列は、a 列と b 列のデータの合計です。DataFrame 自体は、関数に渡された隠し引数です。カラムは、上の例のようにインデックスを使ってアクセスすることもできますし、以下のようにカラム名を使ってアクセスすることもできます。

import pandas as pd
import numpy as np

df = pd.DataFrame([
                    [5,6,7,8],
                    [1,9,12,14],
                    [4,8,10,6]
                    ],
                  columns = ['a','b','c','d'])

print("The original dataframe:")
print(df)

df['e']  = df.apply(lambda x: x.a+x.b, axis = 1)

print("The new dataframe:")
print(df)

この関数は上の例と同じ操作を行う。ここでは lambda 関数を用います。x.ax.b は DataFrame 内のカラム ab を参照します。

関連記事 - Pandas DataFrame

  • Pandas Series を DataFrame に変換