apply 메서드
apply 메서드는 사용자가 작성한 함수를 한 번에 데이터프레임의 각 행과 열에 적용하여 실행할 수 있게 해주는 메서드이다. 즉, 함수를 브로드캐스팅해야 하는 경우에 apply 메서드를 사용한다.
함수를 하나 만들어 보자.
def my_sq(x):
return x ** 2
def my_exp(x, n):
return x ** n
print(my_sq(4))
print()
print(my_exp(2, 4))
이제 apply 메서드를 사용해보자.
import pandas as pd
df = pd.DataFrame({'a': [10, 20, 30], 'b':[20, 30, 40]})
print(df)
print(df['a'] ** 2)
하나하나 적용할 수 있지만 아까 정의해 놓은 함수를 apply 메서드로 적용할 수 있다.
sq = df['a'].apply(my_sq)
print(sq)
ex = df['a'].apply(my_exp, n=2)
print(ex)
이번에는 시리즈가 아니라 데이터프레임에 적용해보자.
def print_me(x):
print(x)
print(df.apply(print_me, axis=0))
데이터프레임에 함수를 적용해야 하기 때문에 함수를 열 방향으로 적용할지 행 방향으로 적용할지 정해야 한다.
axis를 0으로 지정하면 열 방향, 1로 지정하면 행 방향으로 함수를 적용한다.
print(df.apply(print_me, axis=1))
만약 3개의 인자를 입력받아 평균을 계산하는 함수를 사용한다면 인자의 수가 맞지 않아 에러가 발생한다.
1개의 인자로 인식해버리기 때문이다.
def avg_3(x, y, z):
return (x + y + z) / 3
print(df.apply(avg_3))
def avg_3_apply(col):
x = col[0]
y = col[1]
z = col[2]
return (x + y + z) / 3
print(df.apply(avg_3_apply))
위와 같이 하나의 인자로 취급되는 것을 인덱스로 나누어 계산할 수 있다.
이때 col을 row로 변경하고 axis=1로 설정하여 행 방향으로 데이터를 처리할 수 있다.
def avg_2_apply(row):
sum = 0
for item in row:
sum += item
return sum / df.shape[1]
print(df.apply(avg_2_apply, axis=1))
데이터프레임의 누락값 처리하기 - 열 방향
타이타닉 데이터 집합을 이용하여 처리해보자.
import seaborn as sns
titanic = sns.load_dataset("titanic")
print(titanic.info())
import numpy as np
def count_missing(vec):
null_vec = pd.isnull(vec)
null_count = np.sum(null_vec)
return null_count
누락값의 유무에 따라 True, False를 적용한 데이터프레임이 만들어지고 이 값을 sum 메서드로 개수를 더한다.
cmis_col =titanic.apply(count_missing)
print(cmis_col)
null의 비율을 계산해보자.
def prop_missing(vec):
num = count_missing(vec)
dem = vec.size
return num / dem
pmis_col = titanic.apply(prop_missing)
print(pmis_col)
데이터프레임의 누락값 처리하기 - 행 방향
axis를 1로 설정하여 적용하면 어떻게 될까?
cmis_row = titanic.apply(count_missing, axis=1)
pmis_row = titanic.apply(prop_missing, axis=1)
print(cmis_row.head())
print()
print(pmis_row.head())
각 행의 누락값과 비율을 계산하고 있다.
titanic['num_missing'] = titanic.apply(count_missing, axis=1)
print(titanic.loc[titanic.num_missing > 1, :].sample(30))
새로운 열로 null의 수를 저장하여 1개보다 큰 행들을 출력했다.