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