DataFrameのapply関数のaxisで引っかかった話

まずappleメソッドは、axis=1で行に適応されるということ。axis=0、つまりデフォルトでは一番左の列に適応される。ほとんどのメソッドではデフォルトで行に適応されるので、applyメソッドもそうだろうと思いこんでいたからはまってしまった。

実際にコードを書いて体験してみよう。

import pandas as pd
import numpy as np
import datetime as dt
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.DataFrame(
    {
        'height':[170, 166, 181, 162, 158],
        'weight':[59, 54, 62, 85, 59],
        'waist':[69, 68, 76, 90, 74],
    }
)

df

これにBMIカラムを追加したいとき、こうすればいいと思ってた。

def f(row):
    return row['weight'] / (row['height'] * 0.01) ** 2

df['BMI'] = df.apply(f)

エラーが出た。

KeyError: (‘weight’, ‘occurred at index height’)

apply関数の引数にaxis=1を記述すれば良い。

df['BMI'] = df.apply(f, axis=1)

df['BMI']
0    20.415225
1    19.596458
2    18.924941
3    32.388355
4    23.634033
Name: BMI, dtype: float64

デフォルト、つまりaxis=0の場合はどうなるのかというと、一番左の列をとってくる。

df.apply(lambda x : x)
0    170.0
1    166.0
2    181.0
3    162.0
4    158.0

じゃあ次は無名関数を使って標準体重を追加してみよう。

df['std_w'] = df.apply(lambda x: (x['height'] * 0.01) ** 2 * 22, axis=1) 
df['std_w']
0    63.5800
1    60.6232
2    72.0742
3    57.7368
4    54.9208
Name: std_w, dtype: float64