Python/Pandas

[Pandas] 파이썬 데이터프레임 열, 행에 함수 적용 - apply 함수

jimmy_AI 2021. 11. 11. 15:24
반응형

파이썬에서 판다스를 이용하여 데이터프레임 작업을 하다보면

특정 column이나 row에 원하는 작업을 시키고 싶은 경우가 많을 것입니다.

 

이번 포스팅에서는 간단하지만 알아두면 굉장히 요긴한 데이터프레임 열, 행에 함수를 적용시킬 수 있는 pandas 내 apply 함수의 사용법에 대해서 간단히 다루어보도록 하겠습니다.

 

apply 함수로 판다스 데이터프레임 열에 함수 적용

첫 번째로, apply 함수로 column에 함수를 적용하는 예시를 보여드리도록 하겠습니다.

예를 들어 다음과 같은 데이터프레임이 있다고 가정하겠습니다.(변수명 : score_df)

  name mid final assign
0 'abc' 95 97 100
1 'def' 80 92 95
2 'ghi' 85 58 98
3 'jkl' 70 84 92

4명의 학생들에 대한 중간고사, 기말고사 및 과제의 점수인 듯 합니다.

 

자 이제 이 학생들에게 학점을 매기고 싶습니다.

중간고사, 기말고사, 과제를 각각 30%, 40%, 30%씩 반영하여,

90점 이상인 경우 A, 80점 이상이면 B, 70점 이상이면 C, 그 이하면 D를 부여하는 상황이라고 가정하겠습니다.

 

이 작업을 한번에 수행할 수 있는 방법이 있을까요? 다음 코드를 자세히 보겠습니다.

import pandas as pd

def grading(df):
    score = 0.3 * df['mid'] + 0.4 * df['final'] + 0.3 * df['assign']
    if score >= 90:
        return 'A'
    elif score >= 80:
        return 'B'
    elif score >= 70:
        return 'C'
    else:
        return 'D'

score_df['grade'] = score_df.apply(grading, axis = 1) # axis = 1 이면 열에 적용

apply 함수의 사용법(column에 적용 기준)

1. 데이터프레임을 input으로 받는 함수 생성

2. 반영하고 싶은 column 이름을 가져와 적용하고 싶은 함수 내용 작성

3. 원하는 df에 apply 함수로 적용하고 위에서 작성한 함수와 axis = 1을 apply 함수 내에 적용

 

위 소스 코드의 예시를 보시면 이해가 쉬울 것으로 생각됩니다. 실행 결과는 다음과 같았습니다.

  name mid final assign grade
0 'abc' 95 97 100 A
1 'def' 80 92 95 B
2 'ghi' 85 58 98 C
3 'jkl' 70 84 92 B

 

apply 함수로 판다스 데이터프레임 행에 함수 적용

이번에는 새로운 row에 apply 함수를 적용하는 예시를 보겠습니다.

 

아까 처음 선언했던 score_df (grading 이전)에서 각 과목의 최소 점수를 뽑는다고 가정하고 다음 함수를 적용해보겠습니다.

def min_score(df):
    score = df.min()
    return score

score_df.loc[4, :] = score_df.apply(min_score, axis = 0) # axis = 0은 행 적용 의미

4번 인덱스 자리에 각 column마다 최소값을 가지는 value를 가져오도록 지정해보았습니다.

이 때는 loc 함수를 통하여 해당 행을 지정해주는 것이 좋습니다.

적용 방법은 열에 적용할 때와 거의 비슷하긴 하나,

axis = 0을 인자로 두면 행에 적용을 의미하게 됩니다.

한번 적용 결과를 살펴볼까요?

  name mid final assign
0 'abc' 95.0 97.0 100.0
1 'def' 80.0 92.0 95.0
2 'ghi' 85.0 58.0 98.0
3 'jkl' 70.0 84.0 92.0
4 'abc' 70.0 58.0 92.0

name 행에서는 'abc'가 알파벳 순으로 가장 빨라서 등장한 듯 하고,

나머지 행에서는 가장 낮은 점수가 부여된 듯 합니다.

참고로 min 연산에서 정수 자료형이 실수 자료형으로 바뀌었는데, 다시 정수 자료형으로 되돌리고 싶다고 합시다.

사실 간단한 연산의 경우는 다음처럼만 작성해주셔도 좋습니다. (apply 함수를 안쓰셔도 되는 경우 예시)

score_df['mid'] = score_df['mid'].astype(int)

물론 이 경우도 apply에서 적용이 가능하긴 하나, 다른 함수로도 간단히 되는 경우를 보여드렸습니다.

 

다만, 조금이라도 복잡한 task는 단일 함수로는 지원하지 않으니 그럴 때 row나 column 전체에 대해 적용하고 싶으면 apply 함수를 사용하시는 것이 좋을 듯 합니다.

 

지금까지 알면 굉장히 요긴하게 사용 가능한 파이썬의 pandas 데이터프레임 내에서 행이나 열에 함수를 적용하는 방법에 대해서 살펴보았습니다.