파이썬 기반 데이터분석을 위하여 .apply()
메서드를 활용한 Pandas 객체의 요약을 알아본다.
개요
Pandas 데이터프레임 객체를 기준으로 연산을 하고자 할 때 .sum()
또는 .mean()
같은 산술연산 메서드를 사용하면서 행(row)기준, 또는 열(columns) 기준의 연산을 하곤 한다.
※ 관련 게시물: Py) 기초 - Pandas(수치연산)
그런데 내가 실시하고자 하는 연산이 데이터프레임 객체의 메서드로 않을 때가 있다. 이 때 사용하는 메서드가 .apply()
메서드이다. 이 .apply()
메서드에 사용자 정의 함수나 lambda 함수를 같이 사용하면 원하는 결과를 얻을 수 있겠다.
※ 관련 게시물: Py) 기초 - 함수
실습
기존에 .sum()
, .mean()
같은 산술연산자와 .apply()
를 비교해보도록 하자.
우선 다음과 같이 데이터프레임을 준비하자.
1 | df = pd.DataFrame({"이름": ["김철수", "이하윤", "박민수"], |
이름 | 수학점수 | 영어점수 | 국어점수 | |
---|---|---|---|---|
0 | 김철수 | 83 | 75 | 95 |
1 | 이하윤 | 85 | 92 | 70 |
2 | 박민수 | 90 | 50 | 65 |
기본 메서드
.mean()
메서드로 각 행과 열에 대한 평균값을 산출해보자.
1 | df.iloc[:, 1:].mean() |
상기 코드는 다음과 같이 .apply()
로도 할 수 있다.
1 | df.iloc[:, 1:].apply("mean") |
사용자 정의 함수
기본 메서드를 사용하기 위해서 .apply()
를 사용하는 것은 오히려 효율적이지 못한 코드이다. 이제 사용자 정의 함수를 활용한 연산을 해보자. 입력값의 평균에 100을 더하는 사용자 정의 함수인 mean_100()
을 생성하고 이를 .apply()
메서드에 적용해보자.
1 | def mean_100(x): |
기존 Pandas 메서드를 .apply()
메서드에 넣은 코드는 메서드명을 문자열로 넣었지만 사용자 정의 함수는 문자열이 아닌 함수 객체 그대로를 넣는 것을 볼 수 있다. 만약 문자열을 넣는다면 다음과 같은 에러를 확인할 수 있다.
1 | df.iloc[:, 1:].apply("mean_100", axis = 1) |
사용자 정의 함수의 입력은 .apply()
의 인자 “axis”에 지정한 값에 따라 행이나 열을 개별로 쪼갠 시리즈(Series) 객체가 입력이 되기 때문에 운용에 참고하도록 한다.
lambda 함수
사용자 정의 함수는 항상 별도로 함수명을 고민하며 생성해야 하지만 재사용성의 이점이 있다. 그런데 한 두번만 사용하는 경우 사용자 정의 함수를 만들기가 번거로울 수 있는데 이를 대체할 수 있는 것이 lambda 라는 일회성 함수이다. 이 함수는 별도로 함수명을 지정하지 않아도 사용할 수 있으며 예제는 다음과 같다.
1 | df.iloc[:, 1:].apply(lambda x: x.mean() + 100) |
lambda 함수의 인자 “x”에는 앞의 사용자 정의 함수의 입력처럼 행 또는 열 기준으로 쪼개진 시리즈(Series) 객체가 들어간다.