Py) 기초 - Pandas(Apply)

Py) 기초 - Pandas(Apply)

파이썬 기반 데이터분석을 위하여 .apply() 메서드를 활용한 Pandas 객체의 요약을 알아본다.


개요

Pandas 데이터프레임 객체를 기준으로 연산을 하고자 할 때 .sum() 또는 .mean() 같은 산술연산 메서드를 사용하면서 행(row)기준, 또는 열(columns) 기준의 연산을 하곤 한다.
※ 관련 게시물: Py) 기초 - Pandas(수치연산)

그런데 내가 실시하고자 하는 연산이 데이터프레임 객체의 메서드로 않을 때가 있다. 이 때 사용하는 메서드가 .apply() 메서드이다. 이 .apply() 메서드에 사용자 정의 함수나 lambda 함수를 같이 사용하면 원하는 결과를 얻을 수 있겠다.
※ 관련 게시물: Py) 기초 - 함수

.apply() 메서드의 동작

실습

기존에 .sum(), .mean() 같은 산술연산자와 .apply()를 비교해보도록 하자.
우선 다음과 같이 데이터프레임을 준비하자.

1
2
3
4
5
df = pd.DataFrame({"이름": ["김철수", "이하윤", "박민수"],
"수학점수": [83, 85, 90],
"영어점수": [75, 92, 50],
"국어점수": [95, 70, 65]})
df
이름 수학점수 영어점수 국어점수
0 김철수 83 75 95
1 이하윤 85 92 70
2 박민수 90 50 65

기본 메서드

.mean() 메서드로 각 행과 열에 대한 평균값을 산출해보자.

1
2
3
4
5
6
7
8
9
10
11
df.iloc[:, 1:].mean()
## 수학점수 86.000000
## 영어점수 72.333333
## 국어점수 76.666667
## dtype: float64

df.iloc[:, 1:].mean(axis = 1)
## 0 84.333333
## 1 82.333333
## 2 68.333333
## dtype: float64

상기 코드는 다음과 같이 .apply()로도 할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
df.iloc[:, 1:].apply("mean")
## 수학점수 86.000000
## 영어점수 72.333333
## 국어점수 76.666667
## dtype: float64

df.iloc[:, 1:].apply("mean", axis = 1)
## 0 84.333333
## 1 82.333333
## 2 68.333333
## dtype: float64

사용자 정의 함수

기본 메서드를 사용하기 위해서 .apply()를 사용하는 것은 오히려 효율적이지 못한 코드이다. 이제 사용자 정의 함수를 활용한 연산을 해보자. 입력값의 평균에 100을 더하는 사용자 정의 함수인 mean_100()을 생성하고 이를 .apply() 메서드에 적용해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def mean_100(x):
return x.mean() + 100

df.iloc[:, 1:].apply(mean_100)
## 수학점수 186.000000
## 영어점수 172.333333
## 국어점수 176.666667
## dtype: float64

df.iloc[:, 1:].apply(mean_100, axis = 1)
## 0 184.333333
## 1 182.333333
## 2 168.333333
## dtype: float64

기존 Pandas 메서드를 .apply() 메서드에 넣은 코드는 메서드명을 문자열로 넣었지만 사용자 정의 함수는 문자열이 아닌 함수 객체 그대로를 넣는 것을 볼 수 있다. 만약 문자열을 넣는다면 다음과 같은 에러를 확인할 수 있다.

1
2
3
4
5
6
7
8
9
df.iloc[:, 1:].apply("mean_100", axis = 1)
## ---------------------------------------------------------------------------
## AttributeError Traceback (most recent call last)
## Cell In[28], line 1
## ----> 1 df.iloc[:, 1:].apply("mean_100", axis = 1)
##
## ...
##
## AttributeError: 'mean_100' is not a valid function for 'DataFrame' object

사용자 정의 함수의 입력은 .apply() 의 인자 “axis”에 지정한 값에 따라 행이나 열을 개별로 쪼갠 시리즈(Series) 객체가 입력이 되기 때문에 운용에 참고하도록 한다.

lambda 함수

사용자 정의 함수는 항상 별도로 함수명을 고민하며 생성해야 하지만 재사용성의 이점이 있다. 그런데 한 두번만 사용하는 경우 사용자 정의 함수를 만들기가 번거로울 수 있는데 이를 대체할 수 있는 것이 lambda 라는 일회성 함수이다. 이 함수는 별도로 함수명을 지정하지 않아도 사용할 수 있으며 예제는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
11
df.iloc[:, 1:].apply(lambda x: x.mean() + 100)
## 수학점수 186.000000
## 영어점수 172.333333
## 국어점수 176.666667
## dtype: float64

df.iloc[:, 1:].apply(lambda x: x.mean() + 100, axis = 1)
## 0 184.333333
## 1 182.333333
## 2 168.333333
## dtype: float64

lambda 함수의 인자 “x”에는 앞의 사용자 정의 함수의 입력처럼 행 또는 열 기준으로 쪼개진 시리즈(Series) 객체가 들어간다.

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×