본문 바로가기
self.python

[python] 데이터프레임 값에 apply 로 함수 적용하는 다양한 방법

by 톤토니 2022. 6. 1.
반응형

 

 

데이터프레임 값에 apply 로 함수 적용하는 다양한 방법

 

 

데이터 프레임의 값에 각 함수를 적용해야 할 때가 있다.

뭐 예를 들어서.. 각 행 별로 평균값을 계산해서 열로 만들어야 한다던지, 다 같이 +1 이 필요하다던지..

그런 경우에 데이터 프레임에 apply를 사용해서 원하는 값에 원하는 함수를 적용할 수 있다.

 

 

 

1. 데이터 준비

 

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(10, size = (5, )), columns=["First"])
df['Second'] = np.random.randint(10, size = (5,))
df['Third'] = np.random.randint(10, size = (5,)) # 임의의 데이터 프레임을 만들었음

df

 

np.random.randint()를 통해서 1~ 10 사이의 정수를 임의로 불러와 각 열을 (5, 1) size로 지정하여 데이터 프레임으로 만들었다. random 한 값을 불러오기 때문에 실행할 때 마다 새로운 값이 들어갈 수 있다.

이런 데이터 프레임이 있다고 할 때, apply를 이용해서 각 행별, 각 열별 평균을 구해보자!

 

 

2-1. apply 로 평균 구하기

 

df.apply(np.mean, axis = 1) # 행 별로 평균 구하기

axis = 1 일 때 각 행별로 평균이 잘 구해졌음을 확인할 수 있다. 

(2 + 0 + 6) / 3 = 2.66666.......

 

df.apply(np.mean, axis = 0) # 열 별로 평균 구하기

axis = 0 일 때 각 열별로 평균이 잘 구해졌음을 확인할 수 있다.

(2 + 5 + 3 + 4 + 5) / 5 = 3.8

 

 

2-2. apply 로 합계 구하기

합계를 구하는 방법은 평균을 구하는 방법과 동일한데 np.mean대신 np.sum 을 쓰면 된다.

df.apply(np.sum, axis = 1) # 행 별로
df.apply(np.sum, axis = 0) # 열 별로

df['sum'] = df.apply(np.sum, axis = 1)
df

 

이렇게 각 행 별로 합을 구해서 새로운 열을 만들어낼 수 있다. 'sum' 이라는 열을 만들어 First + Second + Third 값을 저장해 주었다.

 

 

 

3. 나만의 함수 정의해서 사용하기

np 에 없는 함수를 따로 정의해서 apply로 사용할 수 있다.

예를 들어서 First 행의 값값을 제곱하고 그 값의 끝자리가 5면 0, 5가 아니면 1을 저장하는 열을 만들고 싶다고 하자.

의미는 없는 식이지만 예시를 들기 위해서 아무렇게나 생각해 낸 것이다.

이런 경우 나만의 함수를 정의해서 apply로 그 함수를 적용하면 된다.

 

def myFunc(x) :
    if x**2 % 10 == 5 :
        return 0
    else :
        return 1

df['myCol'] = df['First'].apply(myFunc)
df

First 행에 있는 값들을 제곱하고 끝자리가 5인 경우만 제대로 0이 들어간 새로운 열 myCol 이 잘 나왔음을 확인할 수 있었다.

 

 


 

4. lamda 함수 이용하기

apply 안에 lambda 함수를 써주는 것도 가능하다.

df['square'] = df['Second'].apply(lambda x : x ** 2)
df

 

lambda 함수가 잘 적용된 것을 확인할 수 있다.

 

 

5. 총 정리

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.randint(10, size = (5, )), columns=["First"])
df['Second'] = np.random.randint(10, size = (5,))
df['Third'] = np.random.randint(10, size = (5,))

df.apply(np.mean, axis = 1)
df.apply(np.sum, axis = 1) # 행 별로 평균, 합 구해보기

df.apply(np.mean, axis = 0)
df.apply(np.sum, axis = 0) # 열 별로 평균, 합 구해보기

df['sum'] = df.apply(np.sum, axis = 1) # 행 별 합으로 새로운 열 만들어보기

def myFunc(x) :
    if x**2 % 10 == 5 :
        return 0
    else :
        return 1

df['myCol'] = df['First'].apply(myFunc) # 나만의 함수 정의해서 적용시키기

df['square'] = df['Second'].apply(lambda x : x ** 2) # 람다 함수 적용시키기

df # 데이터 프레임 확인

 

반응형

댓글